【问题标题】:PySpark escape backslash and delimiter when reading csv读取 csv 时 PySpark 转义反斜杠和分隔符
【发布时间】:2020-05-06 22:35:12
【问题描述】:

我正在尝试在 PySpark 中读取 CSV,其中我的分隔符是“|”,但有些列有“\|”作为单元格中值的一部分。

CSV Data:
a|b|c|this should be \| one column
some_df = spark.read.csv(file, sep="|", quote="")
some_df.show() 

输出:

+---+---+---+----------------+-----------+
|_c0|_c1|_c2|             _c3|        _c4|
+---+---+---+----------------+-----------+
| a | b | c |this should be \| one column|
+---+---+---+----------------+-----------+

预期:

+---+---+---+---------------------------+
|_c0|_c1|_c2|                        _c3|
+---+---+---+---------------------------+
| a | b | c |this should be \ one column|
+---+---+---+---------------------------+

【问题讨论】:

  • 带有| 的值应该用双引号括起来以符合CSV,您是否可以控制输入数据格式?
  • 我无法控制输入数据。我有数千个像这样格式化的 CSV 文件。有问题的列总是有一个“\|”
  • 您可以做一件事,读取为 RDD 并删除该字符并转换为 DataFram
  • @Nikk,我试过这个选项,但没有成功。这是我一直在尝试使用的代码:myfile = sc.textFile("test.txt") myfile2 = myfile.map(lambda x: [re.sub("\\\|", "", x)]) myfile2.toDF().show() 但是,这不会产生预期的输出,所有内容都被视为一列,并且不会合并第三和第四列。我希望正则表达式删除“\|”但它没有
  • 在正则表达式前面贴上r,这样re.sub(r"\\\|", "", x) ...应该更好...

标签: apache-spark pyspark pyspark-sql pyspark-dataframes


【解决方案1】:
>>> rdd  = sc.textFile("/.../file.csv")
>>> rdd.collect()
['a|b|c|this should be \\| one column']

>>> rdd1  = rdd.map(lambda x: x.replace("\\|", ""))
>>> rdd1.collect()
['a|b|c|this should be  one column']

>>> df = rdd1.map(lambda x: (x.split("|"))).map(lambda a : (a[0],a[1],a[2],a[3])).toDF(('col1', 'col2', 'col3', 'col4'))
>>> df.show(10,False)
+----+----+----+--------------------------+
|col1|col2|col3|col4                      |
+----+----+----+--------------------------+
|a   |b   |c   |this should be  one column|
+----+----+----+--------------------------+

【讨论】:

  • 成功了!你能解释一下rdd.collect() 在这个例子中是如何工作的吗?我对 Spark 有点陌生,不熟悉 collect() 的工作原理。
  • 您不需要在实际代码中使用 collect(),在收集所有 RDD 数据并发送给驱动程序的函数中使用 collect(),我已经使用显示 RDD 中包含的值只是为了给你看。
  • 如果列数是动态的怎么办?
猜你喜欢
  • 1970-01-01
  • 2019-09-29
  • 2011-09-16
  • 2018-08-07
  • 2021-12-15
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多