gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:39:40 25 4
gpt4 key购买 nike

我有一个包含普通列的文件和一个包含 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com