form_json返回空值

时间:2019-07-15 05:49:18

标签: apache-spark pyspark

我正在尝试使用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     |
+----+--------+----------+

2 个答案:

答案 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字符串并且它起作用时。 –