我正在尝试使用from_json解析字符串列(包含json字符串),但是当我显示结果数据帧时,它将所有值显示为null。我使用所有类型作为字符串,因此应该没有任何类型转换问题,但最终结果仍为null。 我可以显示我的originaldf,它显示json字符串。
样本json:
{"type": "mytype", "version": "0.2", "id": "dc771a5f-336e-4f65-be1c-79de1848d859"}
我正在从文件中读取json字符串
originaldf = spark.read.option("header",false).schema("message as string").csv(myfilepath)
originaldf显示。在控制台(以本地模式运行)中未显示全部价值
root
|-- message: string (nullable = true)
{"fields":[{"metadata":{},"name":"message","nullable":true,"type":"string"}],"type":"struct"}
+-----------------+
| message|
+-----------------+
|{"type": "mytype"|
+-----------------+
模式传递给from_json
{
"fields":[
{
"metadata":{
},
"name":"id",
"nullable":true,
"type":"string"
},
{
"metadata":{
},
"name":"version",
"nullable":true,
"type":"string"
},
{
"metadata":{
},
"name":"type",
"nullable":true,
"type":"string"
}
],
"type":"struct"
}
newdf = originaldf.select(from_json("message",schema).alias("parsedjson")).select("parsedjson.*")
newdf.show()
,提供输出
+----+--------+---------+
|id | version| type |
+----+--------+----------+
|null| null | null |
+----+--------+----------+
答案 0 :(得分:0)
这很奇怪。我已经复制了它,并且奏效了。我使用的是Spark 2.4.3。
from pyspark.sql import *
row = Row(message='''{"type": "mytype", "version": "0.2", "id": "dc771a5f-336e-4f65-be1c-79de1848d859"}''')
df = spark.createDataFrame([row])
>>> df.show()
+--------------------+
| message|
+--------------------+
|{"type": "mytype"...|
+--------------------+
>>> schema = '''
... {
... "fields":[
... {
... "metadata":{
...
... },
... "name":"id",
... "nullable":true,
... "type":"string"
... },
... {
... "metadata":{
...
... },
... "name":"version",
... "nullable":true,
... "type":"string"
... },
... {
... "metadata":{
...
... },
... "name":"type",
... "nullable":true,
... "type":"string"
... }
... ],
... "type":"struct"
... }
... '''
>>> from pyspark.sql.functions import *
>>> newdf = df.select(from_json("message",schema).alias("parsedjson")).select("parsedjson.*")
>>> newdf.show()
+--------------------+-------+------+
| id|version| type|
+--------------------+-------+------+
|dc771a5f-336e-4f6...| 0.2|mytype|
+--------------------+-------+------+
答案 1 :(得分:0)
感谢您的帮助。我正在以.csv的形式在originaldf中读取数据,由于该数据没有以完整的json格式出现在df中(df.show显示的是部分数据,因此看起来它已加载了全部数据,但df.col()。first.getstring( 0)显示它不是完整的json,而是字符串,直到',',因为我正在读取csv)。当我使用虚拟udf返回json字符串并且它起作用时。 –