处理CSV文件中的JSON对象并保存到PySpark数据帧

2024-04-25 17:08:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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"}]}

测试文件.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数据框加载,以便对其运行SQL查询,要创建一个数据框,我需要再次拆分它,将每个列分配给PySpark,从而再次拆分JSON对象


Tags: 文件csv数据对象字符串jsonapplehello
1条回答
网友
1楼 · 发布于 2024-04-25 17:08:18

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

相关问题 更多 >