scala – Spark联合失败,嵌套的JSON数据帧
我有以下两个
JSON文件:
{ "name" : "Agent1","age" : "32","details" : [{ "d1" : 1,"d2" : 2 } ] } { "name" : "Agent2","age" : "42","details" : [] } 我用火花读了它们: val jsonDf1 = spark.read.json(pathToJson1) val jsonDf2 = spark.read.json(pathToJson2) 使用以下模式创建两个数据帧: root |-- age: string (nullable = true) |-- details: array (nullable = true) | |-- element: struct (containsNull = true) | | |-- d1: long (nullable = true) | | |-- d2: long (nullable = true) |-- name: string (nullable = true) root |-- age: string (nullable = true) |-- details: array (nullable = true) | |-- element: string (containsNull = true) |-- name: string (nullable = true) 当我尝试使用这两个数据帧执行联合时,我收到此错误: jsonDf1.union(jsonDf2) org.apache.spark.sql.AnalysisException: unresolved operator 'Union;; 'Union :- LogicalRDD [age#0,details#1,name#2] +- LogicalRDD [age#7,details#8,name#9] 我该如何解决这个问题?我将在JSON文件中有时会在加载spark作业时获得空数组,但它仍然需要统一它们,这应该不是问题,因为Json文件的模式是相同的. 解决方法
如果您尝试联合2个数据帧,您将得到:
错误:org.apache.spark.sql.AnalysisException:Union只能在具有兼容列类型的表上执行. ArrayType(StringType,true)<>第二个表的第二列的ArrayType(StructType(StructField(d1,StringType,true),StructField(d2,true)),true) Json文件同时到达 要解决这个问题,如果你可以同时阅读JSON,我会建议: val jsonDf1 = spark.read.json(“json1.json”,“json2.json”) 这将给出这个架构: jsonDf1.printSchema |-- age: string (nullable = true) |-- details: array (nullable = true) | |-- element: struct (containsNull = true) | | |-- d1: long (nullable = true) | | |-- d2: long (nullable = true) |-- name: string (nullable = true) 数据输出 jsonDf1.show(10,truncate = false) +---+-------+------+ |age|details|name | +---+-------+------+ |32 |[[1,2]]|Agent1| |42 |null |Agent2| +---+-------+------+ Json文件在不同时间到达 如果你的json在不同的时间到达,作为默认解决方案,我建议读取一个带有完整数组的模板JSON对象,这将使你的数据帧有一个可能的空数组对任何联合都有效.然后,在输出结果之前,您将使用过滤器删除此假JSON: val df = spark.read.json("jsonWithMaybeAnEmptyArray.json","TemplateFakeJsonWithAFullArray.json") df.filter($"name" !== "FakeAgent").show(1) 请注意:已打开Jira卡以提高合并SQL数据类型的功能:https://issues.apache.org/jira/browse/SPARK-19536,这种操作应该可以在下一个Spark版本中使用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |