You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delta表中创建StructType嵌套结构内的生成列?

Delta表嵌套生成列的实现方法

可以创建嵌套在结构体中的生成列,Delta Lake完全支持这种嵌套结构的生成列定义,以下是两种常用实现方式:

方法一:使用DeltaTable API

通过DeltaTable.createOrReplace()结合addColumn()方法,使用点路径(如metadata.id)指定嵌套字段,并定义生成表达式:

import io.delta.tables.DeltaTable
import org.apache.spark.sql.types._

// 定义基础表结构
val baseSchema = StructType(Seq(
  StructField("metadata", StructType(Seq(
    StructField("id", LongType, nullable = false)
  ))),
  StructField("data", StringType),
  StructField("created_at", TimestampType)
))

// 创建Delta表并指定嵌套生成列
DeltaTable.createOrReplace(spark)
  .tableName("nested_generated_col_table")
  .schema(baseSchema)
  .addColumn(
    colName = "metadata.id",
    dataType = LongType,
    generatedAlwaysAs = "cast(hash(data, created_at) AS BIGINT)"
  )
  .execute()

方法二:使用Spark SQL语句

直接在CREATE TABLE的结构体定义中声明生成列,语法更直观:

CREATE OR REPLACE TABLE nested_generated_col_table (
  metadata STRUCT<
    id BIGINT GENERATED ALWAYS AS (cast(hash(data, created_at) AS BIGINT)) STORED
  >,
  data STRING,
  created_at TIMESTAMP
) USING DELTA

注意事项

  • 生成列的表达式必须依赖表中已存在的非生成列(如上例中的data和created_at),不能引用自身或未定义的生成列。
  • 插入数据时无需指定metadata.id的值,Delta会自动计算填充;查询时可直接通过metadata.id引用该列。

内容的提问来源于stack exchange,提问作者H. Sáncheze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:24:16