pyspark 在将一个字符串加载到spark df中之前,我可以替换CSV文件中的所有字符串示例吗?

ego6inou  于 2023-08-02  发布在  Spark
关注(0)|答案(1)|浏览(80)

我有一个大约35 GB的CSV文件,其中包含上述格式的数据。

"Col1"^A"Col2"^A"Col3"^A"Col4"
"1"^A"AB\\"CD"^A"0000"^A"0000"
"2"^A"AB\\"CD\\"^A"0000"^A"0000"

字符串
其中我们有^A分离器
现在的问题是,当我在spark df中加载它时,使用:

df=spark.read.csv(file_path, sep="^A", header=True, multiLine=True)


输出结果如下所示:

"1"|"AB\"CD"|"0000"|"0000"
"2"|"AB\"CD"^A"0000"|"0000"|undefined


如果我试图使用转义选项escape="\\""来解决它,整个df会乱糟糟的,所有列的数据都存储在一行中,\出现,并使multiLine选项无关。
我不能在创建df后使用正则表达式来更改它,因为df中的列已经被扭曲了。
有没有什么方法可以让我通过这个\\打破df问题,而不扰乱multiLine选项?如果没有,有没有什么方法可以通过pyspark将整个CSV文件中的\\"的所有示例替换为",然后创建df?
提前感谢!
尝试使用escape="\\""quote="}",它们确实在某些情况下解决了列问题,但最终会混淆multiLine条目。请让我知道是否需要任何其他输入。- 谢谢-谢谢

bihw5rsg

bihw5rsg1#

即使我在我的环境中也得到了同样的结果。


的数据
你遵循所有这些方法。下面是csv文件中的数据。



在我的例子中,escape \"成功地工作了。

from pyspark.sql.functions import *
df = spark.read.csv("/FileStore/tables/todaytst.csv", sep="^A", header=True, multiLine=True,escape='\"')
df = df.select([regexp_replace("Col1",'\\\\','').alias('Col1'),regexp_replace("Col2",'\\\\','').alias('Col2'),regexp_replace("Col3",'\\\\','').alias('Col3'),regexp_replace("Col4",'\\\\','').alias('Col4')])
display(df)

字符串



如果不起作用,请尝试在上面的代码中使用escape '"'
即使这样也不起作用,首先替换它们并加载到spark dataframe中。
您可以使用下面的函数来替换这些东西并写入新文件。

file_path = "/dbfs/FileStore/tables/todaytst.csv"
output_file_path = "/dbfs/FileStore/tables/modtmp.csv"
with  open(file_path,  "r")  as infile:
    with  open(output_file_path,  "w")  as outfile:
        for line in infile:
            replaced_line = line.replace('\\"',  '"')
            outfile.write(replaced_line)


并读取新文件。

spark.read.csv("/FileStore/tables/modtmp.csv", sep="^A", header=True, multiLine=True)



或者将所有\"替换为空并读取它们。

file_path = "/dbfs/FileStore/tables/todaytst.csv"
output_file_path = "/dbfs/FileStore/tables/modtmp.csv"
with  open(file_path,  "r")  as infile:
    with  open(output_file_path,  "w")  as outfile:
        for line in infile:
            replaced_line = line.replace('\\',  '')
            replaced_line = replaced_line.replace('"',  '')
            outfile.write(replaced_line)


相关问题