首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将分区添加到现有的Iceberg表

如何将分区添加到现有的Iceberg表
EN

Stack Overflow用户
提问于 2020-03-11 11:23:24
回答 2查看 1.6K关注 0票数 3

如何将分区添加到现有的未分区的Iceberg表中?表已经装载了数据。

创建了以下表:

代码语言:javascript
复制
import org.apache.iceberg.hive.HiveCatalog
import org.apache.iceberg.catalog._
import org.apache.iceberg.spark.SparkSchemaUtil
import org.apache.iceberg.PartitionSpec
import org.apache.spark.sql.SaveMode._

val df1 = spark
  .range(1000)
  .toDF
  .withColumn("level",lit("something"))

val catalog = new HiveCatalog(spark.sessionState.newHadoopConf())

val icebergSchema = SparkSchemaUtil.convert(df1.schema)

val icebergTableName = TableIdentifier.of("default", "icebergTab")

val icebergTable = catalog
  .createTable(icebergTableName, icebergSchema, PartitionSpec.unpartitioned)

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2020-10-28 16:33:10

现在,添加分区的方法是手动更新分区规范。

代码语言:javascript
复制
val table = catalog.loadTable(tableName)
val ops = table.asInstanceOf[BaseTable].operations
val spec = PartitionSpec.builderFor(table.schema).identity("level").build

val base = ops.current
val newMeta = base.updatePartitionSpec(spec)
ops.commit(base, newMeta)

有一个拉请求来添加一个操作来进行更改,比如addField("level"),但是这还没有完全完成。我认为它将出现在0.11.0版本中。

请记住:

  • 更改分区规范后,现有数据文件将在分区字段的元数据表中具有空值。这并不意味着如果数据是用新规范编写的,则值将为null,只是元数据没有现有数据文件的值。
  • 动态分区替换在新规范中将有不同的行为,因为分区的粒度不同。如果没有规范,INSERT OVERWRITE将取代整个表。使用规范,只有新行的分区才会被替换。为了避免这种情况,我们建议在Spark中使用DataFrameWriterV2接口,在这里您可以更明确地说明哪些数据值被覆盖。
票数 4
EN

Stack Overflow用户

发布于 2022-01-02 13:42:25

对于Spark3.x,可以使用ALTER扩展将分区字段添加到现有表中:

Iceberg支持使用ADD PARTITION FIELD向规范中添加新的分区字段:

代码语言:javascript
复制
spark.sql("ALTER TABLE default.icebergTab ADD PARTITION FIELD level")

添加分区字段是元数据操作,不更改任何现有表数据。新数据将与新分区一起写入,但现有数据将保留在旧分区布局中。旧数据文件对于元数据表中的新分区字段具有空值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60634897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档