数据覆盖
INSERT OVERWRITE可以用查询的结果替换表中的数据。OVERWRITE是Iceberg表的原子操作。要被INSERT OVERWRITE替换的分区取决于Spark的分区覆盖模式和表的分区。建议使用MERGE INTO而不是INSERT OVERWRITE,因为Iceberg可以仅重写受影响的数据文件,并且具有更容易理解的行为,而且如果表的分区发生变化,被动态重写覆盖的数据可能会发生变化。
Spark的默认覆盖模式是静态的(static),但是在写Iceberg表时建议使用动态覆盖模式。静态覆盖模式通过将PARTITION子句转换为过滤器来确定要覆盖表中的哪些分区,但是PARTITION子句只能引用表的列。
动态覆盖模式是通过设置spark.sql.sources.partitionOverwriteMode=dynamic来配置的。
为了演示动态和静态覆盖的行为,考虑一个由DDL定义的logs表,代码如下:
CREATE TABLE hadoop_prod.my_app.logs ( uuid string NOT NULL, level string NOT NULL, ts timestamp NOT NULL, message string ) USING iceberg PARTITIONED BY (level, hours(ts))
1.动态覆盖
当Spark的覆盖模式是动态的时,包含SELECT查询产生的行的分区将被替换。
例如,查询从示例的logs表中删除重复的日志事件,代码如下:
INSERT OVERWRITE hadoop_prod.my_app.logs SELECT uuid, first ............
抱歉,只有登录会员才可浏览!会员登录