我有一个包含普通列的文件和一个包含 Json 字符串的列,如下所示。还附上图片。每一行实际上属于一个名为 Demo 的列(在 pic 中不可见)。其他列被删除并且在 pic 中不可见,因为它们现在不重要。
[{"key":"device_kind","value":"desktop"},{"key":"country_code","value":"ID"},{"key":"device_platform","value":"windows"}]
请不要更改 JSON 的格式,因为它在数据文件中与上面一样,除了所有内容都在一行中。
每行在列下都有一个这样的对象,比如 JSON。这些对象都在一行中,但在一个数组中。我想使用 spark 解析此列并访问其中每个对象的值。请帮忙。
我想要的是获得关键“值(value)”的值(value)。我的目标是将每个 JSON 对象中的“值”键的值提取到单独的列中。
我尝试使用 get_json_object。它适用于以下 1) Json 字符串,但对 JSON 2) 返回 null
我试过的代码如下
val jsonDF1 = spark.range(1).selectExpr(""" '{"key":"device_kind","value":"desktop"}' as jsonString""")
jsonDF1.select(get_json_object(col("jsonString"), "$.value") as "device_kind").show(2)// prints desktop under column named device_kind
val jsonDF2 = spark.range(1).selectExpr(""" '[{"key":"device_kind","value":"desktop"},{"key":"country_code","value":"ID"},{"key":"device_platform","value":"windows"}]' as jsonString""")
jsonDF2.select(get_json_object(col("jsonString"), "$.[0].value") as "device_kind").show(2)// print null but expected is desktop under column named device_kind
接下来我想使用 from_Json 但我无法弄清楚如何为 JSON 对象数组构建模式。我发现的所有示例都是嵌套 JSON 对象的示例,但与上述 JSON 字符串没有任何相似之处。
我确实发现在 sparkR 2.2 中 from_Json 有一个 bool 参数,如果设置为 true,它将处理上述类型的 JSON 字符串,即 JSON 对象数组,但该选项在 Spark-Scala 2.3.3 中不可用
为了清楚输入和预期输出,它应该如下所示。
i/p 下面
+------------------------------------------------------------------------+
|Demographics |
+------------------------------------------------------------------------+
|[[device_kind, desktop], [country_code, ID], [device_platform, windows]]|
|[[device_kind, mobile], [country_code, BE], [device_platform, android]] |
|[[device_kind, mobile], [country_code, QA], [device_platform, android]] |
+------------------------------------------------------------------------+
预期 o/p 低于
+------------------------------------------------------------------------+-----------+------------+---------------+
|Demographics |device_kind|country_code|device_platform|
+------------------------------------------------------------------------+-----------+------------+---------------+
|[[device_kind, desktop], [country_code, ID], [device_platform, windows]]|desktop |ID |windows |
|[[device_kind, mobile], [country_code, BE], [device_platform, android]] |mobile |BE |android |
|[[device_kind, mobile], [country_code, QA], [device_platform, android]] |mobile |QA |android |
+------------------------------------------------------------------------+-----------+------------+---------------+
最佳答案
谢谢你的回答。它工作正常。
因为我使用的是 2.3.3 spark,所以我以稍微不同的方式解决了这个问题。
val sch = ArrayType(StructType(Array(
StructField("key", StringType, true),
StructField("value", StringType, true)
)))
val jsonDF3 = mdf.select(from_json(col("jsonString"), sch).alias("Demographics"))
val jsonDF4 = jsonDF3.withColumn("device_kind", expr("Demographics[0].value"))
.withColumn("country_code", expr("Demographics[1].value"))
.withColumn("device_platform", expr("Demographics[2].value"))
关于json - Spark : How to parse a Array of JSON object using Spark,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57970480/