加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Spark联合失败,嵌套的JSON数据帧

发布时间:2020-12-16 09:55:59 所属栏目:安全 来源:网络整理
导读:我有以下两个 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(pathT
我有以下两个 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版本中使用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读