python - 将字典文件读取为 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)
问题是我不知道:
- 由于字典和字典之间没有分隔符,如何拆分行
- 字典有不同的长度。
如果您能指出解决此问题的方法或解决方案,我将不胜感激。
解决方案
您可以将其读取为文本,然后拆分}{
以获取 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|
#+------+------+------+