簡體   English   中英

從存儲在列中的 json object 讀取元素

[英]Reading an element from a json object stored in a column

我有以下 dataframe

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

我想檢索此 dataframe 中的所有年齡值,然后將其存儲在數組中。

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

但這會拋出異常。

線程“主”org.apache.spark.sql.AnalysisException:無法從值#89中提取值:需要結構類型但得到字符串;

如何解決我的要求

編輯

 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)

目前沒有拋出異常。 但是我也看不到任何 output

編輯 2

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

output

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

如果您有很長的 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()

Output:

+---+----------+
|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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM