处理 CSV 文件中的 JSON 对象并保存到 PySpark DataFrame

Posted

技术标签:

【中文标题】处理 CSV 文件中的 JSON 对象并保存到 PySpark DataFrame【英文标题】:Handle JSON objects in CSV File and save to PySpark DataFrame 【发布时间】:2020-09-23 16:14:00 【问题描述】:

我有一个 CSV 文件,其中包含 JSON 对象以及其他数据,如字符串、整数。 如果我尝试以 CSV 格式读取文件,则 JSON 对象会在其他列中重叠。

Column1, Column2, Column3, Column4, Column5
100,ABC,"abc": ["xyz": 0, "mno": "h", "apple": 0, "hello": 1, "temp": "cnot"],foo, pine

101,XYZ,"xyz": ["abc": 0, "mno": "h", "apple": 0, "hello": 1, "temp": "cnot"],bar, apple

我得到的输出是:

Column1 | Column2 | Column3 | Column4 | Column5
100 | ABC | "abc": ["xyz": 0, "mno": "h" | "apple": 0, "hello": 1 | "temp": "cnot"]

101 | XYZ | "xyz": ["abc": 0, "mno": "h" | "xyz": ["abc": 0, "mno": "h" | "temp": "cnot"]

Test_File.py

from pyspark.sql import SQLContext 
from pyspark.sql.types import *
    
# Initializing SparkSession and setting up the file source
filepath = "s3a://file.csv"
df = spark.read.format("csv").options(header="true", delimiter = ',', inferschema='true').load(filepath)
df.show(5)

还尝试通过将文件作为文本读取来处理此问题,如 this approach 中所述

'100,ABC,"\'abc\':["\'xyz\':0,\'mno\':\'h\'","\'apple\':0,\'hello\':1,\'temp\':\'cnot\’”]”, foo, pine'

'101,XYZ,"\'xyz\':["\'abc\':0,\'mno\':\'h\'","\'apple\':0,\'hello\':1,\'temp\':\'cnot\’”]”, bar, apple'

但是我不想创建一个新文件,而是将此引用的字符串加载为 PySpark DataFrame 以在它们上运行 SQL 查询,创建一个 DataFrame 我需要再次拆分它以将每一列分配给 PySpark,从而导致拆分JSON 对象。

【问题讨论】:

如果解决了您的问题,请查看答案和mark as answer。 【参考方案1】:

问题在于您使用的分隔符。您正在使用逗号作为分隔符读取 CSV,并且您的 JSON 字符串包含逗号。因此,Spark 也在昏迷状态下拆分 JSON 字符串,因此上述输出。您将需要一个带有分隔符的 CSV,该分隔符是唯一的,并且不会出现在任一列值中,以便克服您的情况。

【讨论】:

以上是关于处理 CSV 文件中的 JSON 对象并保存到 PySpark DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

将 Json 数据存储到 JSON 文件并保存在 CSV 文件中

将 JSON 对象保存到 Node 中的文件中 [重复]

将JSON对象保存到Node中的文件中

遍历 CSV 的每一行并使用 Python-Pandas 写入文件夹中的单个 JSON 文件

Python实现对csv的批量处理并保存

Python实现对csv的批量处理并保存