簡體   English   中英

如何在增量表中創建嵌套生成列(作為 StructType 的一部分)?

[英]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 結構執行addColumnaddColumns之類的操作。 但是,我不確定如何制作嵌套生成的列或如何在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM