[英]How to create a nested generated column (as part of StructType) in a delta table?
是否有人在增量表中創建了嵌套生成列? 像下面的東西
schema
|- metadata: struct
| |- id: bigint // <-- generated column
|- data: string
|- created_at: timestamp
我知道我可以使用DeltaTable.createOrReplace
並使用 spark 結構執行addColumn
或addColumns
之類的操作。 但是,我不確定如何制作嵌套生成的列或如何在 spark 模式中指示應生成某些列。
任何人都知道如何實現這一目標? 或者如果有可能的話。
讓我們創建一個StructType
。
val metadata = StructType(
StructField("long", LongType, nullable = false) ::
StructField("str", StringType, nullable = false) :: Nil)
請注意, StructType
似乎需要使用nullable = false
。 除非字段是nullable
,否則您可能會遇到這個神秘的異常:
The expression type of the generated column metadata is STRUCT<`long`: BIGINT, `str`: STRING>,
but the column type is STRUCT<`long`: BIGINT, `str`: STRING>
(是的,這是正確的。異常不是用戶友好的,是由於這些可為nullable
的 s 是true
)。
獲得數據類型后,可以按如下方式構建帶有 generate 列的 delta 表:
import org.apache.spark.sql.types._
DeltaTable.createOrReplace
.addColumn("id", LongType, nullable = false)
.addColumn(
DeltaTable.columnBuilder("metadata")
.dataType(metadata)
.generatedAlwaysAs("struct(id AS long, 'hello' AS str)")
.build)
.tableName(tableName)
.execute
訣竅是創建與類型匹配的生成表達式(當我完成這個挑戰時,這對我來說很明顯:))。
Append 一些行(不確定為什么 INSERT 不起作用)。
spark.range(5).writeTo(tableName).append()
你應該得到下表:
scala> spark.table(tableName).show
+---+----------+
| id| metadata|
+---+----------+
| 3|{3, hello}|
| 4|{4, hello}|
| 1|{1, hello}|
| 2|{2, hello}|
| 0|{0, hello}|
+---+----------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.