Apache Iceberg 中三种操作表的方式

Apache Iceberg提供了使用HiveCatalog和HadoopCatalog创建表的方法。HiveCatalog借助Hive的MetaStore,而HadoopCatalog直接使用HDFS。此外,还有HadoopTables用于在HDFS目录中存储表,但不支持表的重命名操作。Apache Iceberg的元数据存储是可插拔的,允许自定义存储方式,如AWS将其存储到Glue中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 Apache Iceberg 中有很多种方式可以来创建表,其中就包括使用 Catalog 方式或者实现 org.apache.iceberg.Tables 接口。下面我们来简单介绍如何使用。.

使用 Hive catalog

从名字就可以看出,Hive catalog 是通过连接 Hive 的 MetaStore,把 Iceberg 的表存储到其中,它的实现类为 org.apache.iceberg.hive.HiveCatalog,下面是通过 sparkContext 中的 hadoopConfiguration 来获取 HiveCatalog 的方式:

  1. import org.apache.iceberg.hive.HiveCatalog;

  2. Catalog catalog = new HiveCatalog(spark.sparkContext().hadoopConfiguration());

Catalog 接口里面定义了操作表的方法,比如 createTable, loadTable, renameTable, 以及 dropTable。如果想创建表,我们需要定义 TableIdentifier,表的 Schema 以及分区的信息,如下:

  1. import org.apache.iceberg.Table;

  2. import org.apache.iceberg.catalog.TableIdentifier;

  3. import org.apache.iceberg.PartitionSpec;

  4. import org.apache.iceberg.Schema;

  5. TableIdentifier name = TableIdentifier.of("default", "iteblog");

  6. Schema schema = new Schema(

  7. Types.NestedField.required(1, "id", Types.IntegerType.get()),

  8. Types.NestedField.optional(2, "name", Types.StringType.get()),

  9. Types.NestedField.required(3, "age", Types.IntegerType.get()),

  10. Types.NestedField.optional(4, "ts", Types.TimestampType.withZone())

  11. );

  12. PartitionSpec spec = PartitionSpec.builderFor(schema).year("ts").bucket("id", 2).build();

  13. Table table = catalog.createTable(name, schema, spec);

使用 Hadoop catalog

Hadoop catalog 不依赖 Hive MetaStore 来存储元数据,其使用 HDFS 或者类似的文件系统来存储元数据。注意,文件系统需要支持原子的重命名操作,所以本地文件系统(local FS)、对象存储(S3、OSS等)来存储 Apache Iceberg 元数据是不安全的。下面是获取 HadoopCatalog 例子:

  1. import org.apache.hadoop.conf.Configuration;

  2. import org.apache.iceberg.hadoop.HadoopCatalog;

  3. Configuration conf = new Configuration();

  4. String warehousePath = "hdfs://www.iteblog.com:8020/warehouse_path";

  5. HadoopCatalog catalog = new HadoopCatalog(conf, warehousePath);

和 Hive catalog 一样,HadoopCatalog 也是实现 Catalog 接口的,所以其也实现了表的各种操作方法,包括 createTable, loadTable, 以及 dropTable。下面是使用 HadoopCatalog 来创建 Iceberg 的例子:

  1. import org.apache.iceberg.Table;

  2. import org.apache.iceberg.catalog.TableIdentifier;

  3. TableIdentifier name = TableIdentifier.of("logging", "logs");

  4. Table table = catalog.createTable(name, schema, spec);

使用 Hadoop tables

Iceberg 也支持存储在 HDFS 目录中的表。和 Hadoop catalog 一样,文件系统需要支持原子的重命名操作,所以本地文件系统(local FS)、对象存储(S3、OSS等)来存储 Apache Iceberg 元数据是不安全的。这种方式存储的表并不支持表的各种操作,比如不支持 renameTable。下面是获取 HadoopTables 的例子:

  1. import org.apache.hadoop.conf.Configuration;

  2. import org.apache.iceberg.hadoop.HadoopTables;

  3. import org.apache.iceberg.Table;

  4. Configuration conf = new Configuration():

  5. HadoopTables tables = new HadoopTables(conf);

  6. Table table = tables.create(schema, spec, table_location);

在 Spark 中,其支持 HiveCatalog、HadoopCatalog 以及 HadoopTables 方式来创建、加载表。如果传入的表不是一个路径,则选择 HiveCatalog,否则 Spark 将推断出表是存储在 HDFS 上的。

当然,Apache Iceberg 表元数据存储地方是可插拔的,所以我们完全可以自定义元数据存储的方式,比如 AWS 就给社区提了一个 issue,其把 Apache Iceberg 中的元数据存储到 glue 里面,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值