dremio jdbc 插件时间增量处理的一些问题

发布时间 2024-01-12 14:41:22作者: 荣锋亮

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 元数据信息

说明

实际上精度的问题在不少系统都会有类似的问题,只是我们很多时候应该注意下,否则会有莫名的问题

参考资料

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