首页 > 解决方案 > 将字典文件读取为 pyspark 数据框

问题描述

我正在处理的问题是我有一个文件(或多个文件)充满了字典,我正试图进入一个数据框。输入文件可能如下所示:

{"A":"value1", "B":"value2"}
{"A":"value2", "B":"value3"}
{"A":"value4", "B":"value5", "C":"value6"}

我正在处理的问题:

在上面的例子中,期望的结果是:

A          B          C
value1     value2     null
value2     value3     null
value4     value5     value6

到目前为止我已经尝试过:

spark_sql_context.read.json(path_to_file)

这只会读取第一个字典并返回一个包含一行的 pyspark 数据帧。我也尝试将其作为文本文件读取:

data_rdd = spark_context.textFile(path_to_file)

问题是我不知道:

  1. 由于字典和字典之间没有分隔符,如何拆分行
  2. 字典有不同的长度。

如果您能指出解决此问题的方法或解决方案,我将不胜感激。

标签: pythonapache-sparkpysparkpyspark-sqlpyspark-dataframes

解决方案


您可以将其读取为文本,然后拆分}{以获取 JSON 对象数组。为此,首先,我们用 替换}{};{然后拆分;

df = spark.read.text(path)
df = df.withColumn("values", explode(split(regexp_replace(col("value"), "\\}\\{", "\\};\\{"), ";")))

df.show()

#+------------------------------------------+
#|value                                     |
#+------------------------------------------+
#|{"A":"value1", "B":"value2"}              |
#|{"A":"value2", "B":"value3"}              |
#|{"A":"value4", "B":"value5", "C":"value6"}|
#+------------------------------------------+

现在,from_json与您schema一起使用将 json 解析为结构:

schema = StructType([StructField("A", StringType(), True),
                     StructField("B", StringType(), True),
                     StructField("C", StringType(), True)
                    ])

df = df.withColumn("value", from_json(col("value"), schema)).select("value.*")

df.show()

#+------+------+------+
#|A     |B     |C     |
#+------+------+------+
#|value1|value2|null  |
#|value2|value3|null  |
#|value4|value5|value6|
#+------+------+------+

推荐阅读