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

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

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

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

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

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

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

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

628mspwn

628mspwn1#

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

  1. from pyspark.sql import functions as F
  2. df = spark.read.text(file_path)
  3. df = df.filter("value != 'FullName, FullLabel, Type'") \
  4. .withColumn(
  5. "value",
  6. F.split(F.col("value"), ',(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)')
  7. ).select(
  8. F.col("value")[0].alias("FullName"),
  9. F.col("value")[1].alias("FullLabel"),
  10. F.col("value")[2].alias("Type")
  11. )
  12. df.show(truncate=False)
  13. # +----------+--------------------------------------------------+-----+
  14. # |FullName |FullLabel |Type |
  15. # +----------+--------------------------------------------------+-----+
  16. # |TEST.slice| "Consideration":"Verde (Spar Verde, Fonte Verde)"| Test|
  17. # +----------+--------------------------------------------------+-----+

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

  1. df = sc.binaryFiles(file_path) \
  2. .flatMap(lambda x: [[l] for l in x[1].decode("utf-16").split("\n")]) \
  3. .toDF(["value"])
展开查看全部
cqoc49vn

cqoc49vn2#

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

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

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

  1. from pyspark.sql import functions as F
  2. spark.read.option('header','true').csv(tempPath).withColumn('FullLabel',F.regexp_replace(F.col('FullLabel'),'~:~','":"')).show(1, False)
  3. +----------+-----------------------------------------------+----+
  4. |FullName |FullLabel |Type|
  5. +----------+-----------------------------------------------+----+
  6. |TEST.slice|Consideration":"Verde (Spar Verde, Fonte Verde)|Test|
  7. +----------+-----------------------------------------------+----+

相关问题