Iceberg从入门到精通系列之十四:合并文件和元数据管理
一、合并文件
- 合并指定数据库和表目录下的文件
import org.apache.hadoop.conf.Configuration;
import org.apache.iceberg.Table;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.flink.actions.Actions;
import org.apache.iceberg.hadoop.HadoopCatalog;
public class RewriteDataFileDemo {
public static void main(String[] args) {
//1.创建catalog对象
Configuration conf = new Configuration();
HadoopCatalog hadoopCatalog = new HadoopCatalog(conf, "hdfs://hadoop1:8020/warehouse/spark-iceberg/");
//2.通过catalog加载Table对象
Table table = hadoopCatalog.loadTable(TableIdentifier.of("default", "order"));
//3.通过Actions来操作合并
Actions.forTable(table)
.rewriteDataFiles()
.targetSizeInBytes(1024L)
.execute();
}
}
二、Iceberg表元数据管理
Table 接口提供对表元数据的访问:
- schema:返回当前表模式
- spec:返回当前表分区规范
- properties:返回键值属性的映射
- currentSnapshot:返回当前表快照
- snapshots:返回表的所有有效快照
- snapshot(id):按 ID 返回特定快照
- location:返回表的基位置
表还提供刷新以将表更新到最新版本,并公开帮助程序:
- io 返回用于读写表文件的FileIO
- locationProvider 返回用于创建数据和元数据文件路径的 LocationProvider
三、Iceberg表元数据管理代码实现
//1.创建catalog对象
Configuration conf = new Configuration();
HadoopCatalog hadoopCatalog = new HadoopCatalog(conf, "hdfs://hadoop1:8020/warehouse/spark-iceberg/");
//2.通过catalog加载Table对象
Table table = hadoopCatalog.loadTable(TableIdentifier.of("default", "order"));
//有table对象就可以访问元数据
System.out.println(table.history());
System.out.println(table.expireSnapshots().expireOlderThan(12));