json - Spark : How to parse a Array of JSON object using Spark

标签 json apache-spark apache-spark-sql schema

我有一个包含普通列的文件和一个包含 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
  • {"key":"device_kind","value":"desktop"}
  • [{"key":"device_kind","value":"desktop"},{"key":"country_code","value":"ID"},{"key":"device_platform","value": "windows"}]

  • 我试过的代码如下
    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        |
    +------------------------------------------------------------------------+-----------+------------+---------------+
    

    enter image description here

    最佳答案

    谢谢你的回答。它工作正常。
    因为我使用的是 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/

    相关文章:

    json - 为什么 Boost 属性树 write_json 将所有内容都保存为字符串?有可能改变吗?

    python - 按日期分组 Spark 数据框

    scala - 如何将多列连接成单列(对其数量没有先验知识)?

    dataframe - 如何在pyspark中将分组数据存储到json中

    json - 如何将json解码为结构

    jquery - AJAX 调用可能导致站点内存泄漏

    java - 我无法从 JSON 数组获取图像字节,有人可以帮助我吗?

    python - Spark java.lang.VerifyError

    caching - apache Spark sql 中的缓存表

    apache-spark - 具有两个日期列的 Spark 时间序列查询