uniqueidentifier 类型用来存储guid,sql server内部存储为16个固定字节的二进制数据,在dremio 当前的arp 类型映射中,存储为了varbinary,机制上没有问题,但是很多时候大家希望使用可视化的字符串格式uuid(因为映射为varbinary,界面显示就是一个base64格式了)

解决方法

方法比较多,一种就是使用自定义函数,一种就是修改类型映射

  • 直接使用内置十六进制处理函数

会有格式不一致,但是基本可以用,尤其是mongdb 这类,不存在特殊字符的(-)

UPPER(to_hex(<field>))
  • 自定义函数处理

频繁调用,性能可能不是很好

CREATE FUNCTION uuid(id VARBINARY) RETURNS VARCHAR RETURN  CONCAT(
  SUBSTR(TO_HEX(CAST(id AS VARBINARY)), 1, 8), '-',
  SUBSTR(TO_HEX(CAST(id AS VARBINARY)), 9, 4), '-',
  SUBSTR(TO_HEX(CAST(id AS VARBINARY)), 13, 4), '-',
  SUBSTR(TO_HEX(CAST(id AS VARBINARY)), 17, 4), '-',
  SUBSTR(TO_HEX(CAST(id AS VARBINARY)), 21, 12)
)
  • 类型映射
- source:
    name: "uniqueidentifier"
    max_precision: 8000
    literal_length_limit: 8000
  required_cast_args: "precision"
  dremio:
    name: "varchar"
  • 实际处理

可以开发自己的arp (扩展版sql server) 或者直接修改ce jdbc plugin mssql 的arp yaml 定义

说明

以上是问题的几种解决方法,通过代码模式的修改的代码我已经放github 了,大家可以参考,同时构建包也发布了(24.3版本的,新版本类似)

参考资料

https://github.com/rongfengliang/my-dremio-mssql-connector

https://learn.microsoft.com/en-us/sql/t-sql/data-types/uniqueidentifier-transact-sql?view=sql-server-ver17