如何使用pyspark读取csv文件并在引号中添加逗号?

oyxsuwqo  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(472)

在中读取以下csv数据时遇到一些问题 UTF-16 :

FullName, FullLabel, Type
TEST.slice, "Consideration":"Verde (Spar Verde, Fonte Verde)", Test,

据我所知,这对读者来说应该不是问题,因为有一个 quote 参数来处理。

df = spark.read.csv(file_path, header=True, encoding='UTF-16', quote = '"')

但是,这仍然会给我一个不正确的分割:

有什么办法来处理这些案子吗?还是我需要和rdd一起解决?
先谢谢你。

628mspwn

628mspwn1#

您可以使用 spark.read.text 然后使用一些正则表达式按逗号拆分值,但忽略引号(您可以看到这篇文章),然后从生成的数组中获取相应的列:

from pyspark.sql import functions as F

df = spark.read.text(file_path)

df = df.filter("value != 'FullName, FullLabel, Type'") \
    .withColumn(
    "value",
    F.split(F.col("value"), ',(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)')
).select(
    F.col("value")[0].alias("FullName"),
    F.col("value")[1].alias("FullLabel"),
    F.col("value")[2].alias("Type")
)

df.show(truncate=False)

# +----------+--------------------------------------------------+-----+

# |FullName  |FullLabel                                         |Type |

# +----------+--------------------------------------------------+-----+

# |TEST.slice| "Consideration":"Verde (Spar Verde, Fonte Verde)"| Test|

# +----------+--------------------------------------------------+-----+

更新:
对于中的输入文件 utf-16 ,可以替换 spark.read.text 通过将文件加载为 binaryFiles 然后将结果rdd转换为Dataframe:

df = sc.binaryFiles(file_path) \
    .flatMap(lambda x: [[l] for l in x[1].decode("utf-16").split("\n")]) \
    .toDF(["value"])
cqoc49vn

cqoc49vn2#

下面是另一个选项(如果您觉得简单):
首先将文本文件读取为rdd并替换 ":"~:~ 并保存文本文件。

sc.textFile(file_path).map(lambda x: x.replace('":"','~:~')).saveAsTextFile(tempPath)

接下来,读取临时路径并替换 ~:~":" 再说一次,但这次是作为一个df。

from pyspark.sql import functions as F
spark.read.option('header','true').csv(tempPath).withColumn('FullLabel',F.regexp_replace(F.col('FullLabel'),'~:~','":"')).show(1, False)

+----------+-----------------------------------------------+----+
|FullName  |FullLabel                                      |Type|
+----------+-----------------------------------------------+----+
|TEST.slice|Consideration":"Verde (Spar Verde, Fonte Verde)|Test|
+----------+-----------------------------------------------+----+

相关问题