问题
是常见的JSON文件包含嵌套的结构体列。嵌套列名在JSON文件中可以有空间之间的名字。
当你使用Apache火花读或写JSON文件嵌套列名称中使用空格,你得到一个AnalysisException错误消息。
例如,如果您试图读取JSON文件,评估DataFrame,然后写出来一个增量表DBR 10.2或低于它返回一个错误。
% scala val df = spark.read.json (“< path-to-JSON-file >”) df.write.format .mode(“δ”)(“覆盖”).save (“< path-to-delta-table >”)
预期的错误消息是可见的堆栈跟踪。
stage_info.Accumulables AnalysisException:属性名称”。数失败值中包含无效的字符(s),, {} () \ n \ t =”。请使用别名来重命名它。
导致
嵌套列名称之一DataFrame包含空格,这是防止你写输出差值表。
解决方案
如果你的源文件是简单的,你可以使用withColumnRenamed重命名多个列和删除空间。但是,这很快就会复杂嵌套模式。
withColumn可用于压平嵌套列和重命名现有列(空格)一个新列名称(没有空格)。在大型模式的情况下,压扁的所有嵌套列DataFrame可以是一个冗长乏味的任务。
如果你的集群使用砖运行时的10.2或以上可以完全避免这个问题通过允许列映射模式。列映射模式以及允许使用空间,;{}()\ n \ t =表中的列名。
设置三角洲表的属性delta.columnMapping.mode来的名字启用列映射模式。
此示例代码设置了一个三角洲能够支持嵌套表列的名称空间,但是它需要一个集群运行砖运行时的10.2或以上。
% scala进口io.delta.tables.DeltaTable val df = spark.read.json (“< path-to-JSON-file >”) DeltaTable.create () .addColumns df.schema .property(“三角洲。minReaderVersion”、“2”) .property(“三角洲。minWriterVersion”、“5”) .property (“delta.columnMapping。模式”、“名称”).location (“< path-to-delta-table >”) . execute () df.write.format(“δ”).mode .save(“追加”)(“< path-to-delta-table >”)