我的数据框看起来像|ID|Notes|---------------|1|'{\'Country\':\'USA\',\'Count\':\'1000\'}'||2|{\'Country\':\'USA\',\'Count\':\'100...
我的数据框看起来像
|ID|Notes|
---------------
|1|'{"Country":"USA","Count":"1000"}'|
|2|{"Country":"USA","Count":"1000"}|
ID : int
Notes : string
当我使用 from_json 来解析列 Notes 时,它会给出所有 Null 值。我需要帮助将此列 Notes 解析为 pyspark 中的列
使用 from_json()
函数时,请确保列值完全是字符串格式的 json/dictionary。在您提供的示例数据中,列值 Notes
不 id=1
完全是 json 格式(它是一个字符串,但括在额外的单引号中)。 这就是它返回 NULL 值的原因。 在输入数据框上执行以下代码将产生以下输出。
df = df.withColumn("Notes",from_json(df.Notes,MapType(StringType(),StringType())))
您需要更改输入数据,使整个 Notes 列采用相同的格式,即 json/dictionary 作为字符串,仅此而已,因为这是导致问题的主要原因。以下是帮助您解决问题的正确格式。
| ID | Notes |
---------------
| 1 | {"Country":"USA","Count":"1000"} |
| 2 | {"Country":"USA","Count":"1000"} |
要将 Notes 列值解析为 pyspark 中的列,您只需使用调用的函数 json_tuple()
(无需使用 from_json())。它从 json 列(字符串格式)中提取元素并将结果创建为新列。
df = df.select(col("id"),json_tuple(col("Notes"),"Country","Count")) \
.toDF("id","Country","Count")
df.show()
输出:
注意: 如果列值的格式不正确,json_tuple() 也会返回 null(确保列值是 json/dictionary 类型的字符串,没有额外的引号)。