發現錯誤塊創建一個三角洲表複製列

不允許重複的列名在三角洲表。

寫的deepak.bhutada

去年發表在:2023年7月28日

問題

你有一個結構體數組列與一個或多個DataFrame重複的列名。

如果你想創建一個增量表得到一個發現重複的列(s)在數據保存:錯誤。

示例代碼

你可以用這個例子複製錯誤代碼。

1)第一步設置一個數組與重複的列名。重複的列在示例代碼被注釋。

% scala / /示例json文件測試to_json函數val arrayStructData = Seq(行(“詹姆斯”,列表(行(“Java”、“XX”, 120年,“Java”)、行(“scala”、“XA”, 300年,“scala”)))、行(“邁克爾”,列表(行(“Java”、“XY”, 200年,“Java”)、行(“scala”、“XB”, 500年,“scala”)))、行(“羅伯特”,列表(行(“Java”、“XZ”, 400年,“Java”)、行(“scala”,“我”,250年,“scala”))))進口org.apache.spark.sql.types。{StructType, StructField, StringType、IntegerType ArrayType};val arrayStructSchema = new StructType閥門()(“名字”,StringType)閥門(“booksIntersted ArrayType(新StructType閥門()(“名字”,StringType) /閥門/複製列(“作者”,StringType)閥門閥門(“頁麵”,IntegerType)(“名字”,StringType))) / /複製列val df = spark.createDataFrame(火花。df sparkContext .parallelize (arrayStructData) arrayStructSchema)。printSchema / / df和結構類型

2)驗證DataFrame後,我們試圖創建一個增量表和獲得發現重複的列(s)在數據保存:錯誤。

% scala df.createOrReplaceTempView (df) df.write.format(“δ”).save (“/ mnt /δ/測試/ df_issue”)火花。sql(“使用三角洲位置創建表事件/ mnt /δ/測試/ df_issue’”)

導致

結構體數組具有相同名稱的列包含重複的列不能出現在三角洲表。這是真的,即使名稱在不同的情況下。

三角洲湖case-preserving,但不區分大小寫,當存儲模式。

為了避免潛在的數據損壞或數據丟失,不允許重複的列名。

解決方案

這種方法涉及將父列重複的列名為json字符串。

1)你需要轉換structtype字符串使用to_json ()函數創建三角洲表之前。

% scala org.apache.spark.sql.functions進口。to_json val df1 = df.select (df(“名字”),to_json (df (“booksIntersted”)) .alias (“booksIntersted_string”)) / /使用這個df1.write.format .save(“δ”)(“/ mnt /δ/ df1_solution”)火花。sql(“使用三角洲創建表events_solution位置/ mnt /δ/ df1_solution”)火花。sql(“描述events_solution”),告訴()

2)使用get_json_object ()函數從轉換後的字符串類型列中提取信息。

% scala org.apache.spark.sql.functions進口。get_json_object val df2 = df1.select (df1(“名字”),get_json_object (df1 (“bookInterested”)、“$ {0} .author”), get_json_object (df1 (“bookInterested”)、“$ {0} .pages "))顯示(df2)


這篇文章有用嗎?