【问题标题】:Reading an element from a json object stored in a column从存储在列中的 json 对象中读取元素
【发布时间】:2021-06-08 11:01:55
【问题描述】:

我有以下数据框

+-------+--------------------------------
|__key__|______value____________________| 
|  1    | {"name":"John", "age": 34}    |
|  2    | {"name":"Rose", "age": 50}    |

我想检索此数据框中的所有年龄值,然后将其存储在一个数组中。

val x = df_clean.withColumn("value", col("value.age"))
x.show(false)

但这会抛出异常。

线程“主”org.apache.spark.sql.AnalysisException 中的异常: Can't extract value from value#89: need struct type but got string;

如何解决我的要求

编辑

 val schema = existingSparkSession.read.json(df_clean.select("value").as[String]).schema
    val my_json = df_clean.select(from_json(col("value"), schema).alias("jsonValue"))
    my_json.printSchema()
    val df_final = my_json.withColumn("age", col("jsonValue.age"))
    df_final.show(false)

目前没有抛出异常。但是我也看不到任何输出

编辑 2

println("---+++++--------")
df_clean.select("value").take(1)
println("---+++++--------")

输出

---+++++--------
---+++++--------

【问题讨论】:

    标签: json scala dataframe apache-spark apache-spark-sql


    【解决方案1】:

    如果你有很长的 json 并且想要创建架构,那么你可以使用 from_json 和架构。

    import org.apache.spark.sql.functions._
    
    val df = Seq(
      (1, "{\"name\":\"John\", \"age\": 34}"),
      (2, "{\"name\":\"Rose\", \"age\": 50}")
    ).toDF("key", "value")
    
    val schema = spark.read.json(df.select("value").as[String]).schema
    
    val resultDF = df.withColumn("value", from_json($"value", schema))
    
    resultDF.show(false)
    resultDF.printSchema()
    

    输出:

    +---+----------+
    |key|value     |
    +---+----------+
    |1  |{34, John}|
    |2  |{50, Rose}|
    +---+----------+
    

    架构:

    root
     |-- key: integer (nullable = false)
     |-- value: struct (nullable = true)
     |    |-- age: long (nullable = true)
     |    |-- name: string (nullable = true)
    

    如果您直接需要访问嵌套字段,则可以使用get_json_object

    df.withColumn("name", get_json_object($"value", "$.name"))
      .withColumn("age", get_json_object($"value", "$.age"))
      .show(false)
    

    【讨论】:

    • 对于 get_json_object 我收到错误“无法解析符号 get_json_object”
    • 请使用import org.apache.spark.sql.functions._,也可以分享df_clean.show的输出
    • @tharindu 请检查我使用的数据与您提供的完全相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多