【问题标题】:Handle JSON objects in CSV File and save to PySpark DataFrame处理 CSV 文件中的 JSON 对象并保存到 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 对象。

【问题讨论】:

标签: python json csv pyspark apache-spark-sql


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-07-09
    • 2015-05-11
    • 2017-07-11
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2021-04-08
    相关资源
    最近更新 更多