dremio jdbc 插件时间增量处理的一些问题
dremio 支持一些增量数据处理能力,同时可以选择增量字段,目前dremio 是提供了一些实现,比如反射数据基于iceberg对于增量
可以是不同的数据源(jdbc 的,文件系统的,iceberg 的),日常大家可能选择基于时间戳的(尤其业务系统是基于时间标识的append 类型的)
对于时间类型(timestamp),不同数据库会有不同的精度支持,比如mysql 也支持精度,postgres 也是支持精度的
timestamp问题
目前postgres 对于timestamp 默认的精度是6位(可以自己调整),但是默认dremio 对于timestamp 的处理精度为3,所以如果对于pg append 类型的表进行
增量处理就会发现数据有问题(数据会重复)
- 精度检查
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
解决方法
- 数据distinct 处理
对于增量之后的数据,使用distinct,可以规避重复数据 - 统一精度规避数据问题
将source 的timestamp 精度类型调整为3
dremio 增量一个简单处理
- 参考sql 格式
如下会包含一个$_dremio_$_update_$
的增量字段,后续查询会使用此字段进行增量查询
一个int 类型的
"sensor_data_store"."q3", "sensor_data_store"."t", "sensor_data_store"."electricquantitypercentage", "sensor_data_store"."versionnumber" COLLATE "C", "sensor_data_store"."id" AS "$_dremio_$_update_$" FROM "public"."sensor_data_store" WHERE ("sensor_data_store"."id" > 309371)","e1 [main]"
一个timestamp 类型的
"sensor_data_store"."versionnumber" COLLATE "C", "sensor_data_store"."ingress_data" AS "$_dremio_$_update_$" FROM "public"."sensor_data_store" WHERE ("sensor_data_store"."ingress_data" > TIMESTAMP '2024-01-06 06:55:47.617')","e3
dremio 反射存储的iceberg 元数据信息
说明
实际上精度的问题在不少系统都会有类似的问题,只是我们很多时候应该注意下,否则会有莫名的问题,注意dremio 也是可以创建iceberg 表的,可以指定timestamp 的精度,但是实际存储还是3位精度的
参考资料
https://docs.dremio.com/current/sonar/reflections/refreshing-reflections
https://docs.dremio.com/cloud/reference/sql/information-schema/columns/#fields
com/dremio/exec/store/iceberg/IncrementalReflectionByPartitionUtils.java
com/dremio/service/reflection/IncrementalUpdateServiceUtils.java