如何将分区添加到现有的未分区的Iceberg表中?表已经装载了数据。
创建了以下表:
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)有什么建议吗?
发布于 2020-10-28 16:33:10
现在,添加分区的方法是手动更新分区规范。
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版本中。
请记住:
INSERT OVERWRITE将取代整个表。使用规范,只有新行的分区才会被替换。为了避免这种情况,我们建议在Spark中使用DataFrameWriterV2接口,在这里您可以更明确地说明哪些数据值被覆盖。发布于 2022-01-02 13:42:25
对于Spark3.x,可以使用ALTER扩展将分区字段添加到现有表中:
Iceberg支持使用
ADDPARTITION FIELD向规范中添加新的分区字段:
spark.sql("ALTER TABLE default.icebergTab ADD PARTITION FIELD level")添加分区字段是元数据操作,不更改任何现有表数据。新数据将与新分区一起写入,但现有数据将保留在旧分区布局中。旧数据文件对于元数据表中的新分区字段具有空值。
https://stackoverflow.com/questions/60634897
复制相似问题