iceberg 的使用记录

_event_time: TIMESTAMP(6) ,到毫秒级

_event_time BETWEEN FROM_UNIXTIME(1679939825) and FROM_UNIXTIME(1680544625); # TIMESTAMP 的时间范围过滤方法

double_timestamp BETWEEN SYMMETRIC cast(1681117200 as double) and cast(1681120800 as double) # double 类型的时间范围过滤方法

select UNIX_TIMESTAMP(CAST(_event_time AS STRING)); # 转换为 BIGINT, 小心时区的设置;https://blog.csdn.net/qq_36908872/article/details/127111288

select TO_TIMESTAMP(CAST(_event_time AS STRING)); # TO_TIMESTAMP 计算出来的还是 TIMESTAMP 类型,不能 * int

select UNIX_TIMESTAMP(CAST(_event_time AS STRING)) * 1000 from xraydb.xrayMeta limit 5; # 正确,返回类型: BIGINT

select (UNIX_TIMESTAMP(CAST(obstacle._event_time AS STRING))) * 1000 + EXTRACT(MILLISECOND FROM _event_time); # 不丢失毫秒级数据

字段中如果和函数名冲突的话,要加上``,比如 position

SELECT _xray_id, current_perception_pose_3d, _event_time, T.intent, T.perception_obstacle, T.perception_obstacle.type, T.perception_obstacle.sub_type FROM xrayData.\`@xurban@prediction\`, LATERAL TABLE(TableFunc(prediction_obstacle)) as T; # 把 表中的 array 展开

public class QueryUDF {
    public static class TableFunc extends TableFunction<Row> {
        @FunctionHint(
            input = @DataTypeHint(QueryUDFDataTypeHint.TableFuncInputKmsg),
            output = @DataTypeHint(QueryUDFDataTypeHint.TableFuncOutputKmsg)
        )
        @FunctionHint(
            input = @DataTypeHint(QueryUDFDataTypeHint.TableFuncInputPerceptionObstacle),
            output = @DataTypeHint(QueryUDFDataTypeHint.TableFuncOutputPerceptionObstacle)
        )
        public void eval(Row[] values) {
            for (Row value: values) {
                Set<String> fieldsNames = value.getFieldNames(true);
                if (fieldsNames.contains("message")) {
                    collect(Row.of(value.getField("message")));
                } else {
                    Row obstacle = (Row) value.getField("perception_obstacle");
                    Row velocity = (Row) obstacle.getField("velocity");
                    Row acceleration_filtered = (Row) obstacle.getField("acceleration_filtered");
                    Row position = (Row) obstacle.getField("position");
                    Row intent = (Row) value.getField("intent");
                    collect(Row.of(
                            Row.of(
                                    obstacle.getField("unique_id"), obstacle.getField("type"),
                                    obstacle.getField("sub_type"),
                                    Row.of(velocity.getField("x"), velocity.getField("y"), velocity.getField("z")),
                                    Row.of(acceleration_filtered.getField("x"), acceleration_filtered.getField("y"), acceleration_filtered.getField("z")),
                                    Row.of(position.getField("x"), position.getField("y"), position.getField("z")),
                                    obstacle.getField("theta")),
                            Row.of(intent.getField("type")))
                    );
                }
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Iceberg CDC(Change Data Capture)是一种常见的数据同步方式,用于将数据库中的变更同步到其他系统或数据仓库中。Iceberg CDC 通常包括以下步骤: 1. 捕获变更:通过轮询数据库的事务日志或使用数据库提供的 CDC 功能捕获变更。对于每个变更,记录变更的类型、时间戳、表名、主键值和变更的数据。 2. 转换数据:将捕获的变更数据转换为目标系统可接受的格式。通常需要进行一些数据转换和规范化,确保数据的一致性和完整性。 3. 传输数据:将转换后的数据传输到目标系统。可以通过消息队列、HTTP 接口等方式传输数据。 4. 应用变更:在目标系统中应用变更。通常需要维护一个增量的数据集,以便每次同步只应用新增、修改和删除的变更,避免重复数据和性能问题。 Iceberg CDC 的实现可以基于开源的 CDC 工具如 Debezium、Maxwell 等,也可以自行开发。通常需要考虑以下问题: 1. 数据库日志格式:不同的数据库使用不同的日志格式,需要了解数据库日志的格式和捕获方式。 2. 数据转换:需要将捕获的变更数据转换为目标系统可接受的格式。可以使用开源的 ETL 工具如 Apache NiFi、Apache Kafka Connect 等,也可以自行开发。 3. 数据传输:需要选择适合的数据传输方式,如消息队列、HTTP 接口等。 4. 数据一致性和完整性:需要确保数据的一致性和完整性,尤其是在多个目标系统中同步数据时。可以使用事务、幂等性等技术来保证数据的一致性和完整性。 总之,Iceberg CDC 是一种非常常见的数据同步方式,可以帮助组织实现数据的实时同步和集成。但是,实现 Iceberg CDC 需要考虑多种因素,包括数据库日志格式、数据转换、数据传输、数据一致性和完整性等,需要仔细设计和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值