问题
你有一个结构体数组列与一个或多个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)