如何在Spark中替换转义的换行符

时间:2018-11-05 01:42:13

标签: apache-spark pyspark

我有一个csv,未引用,在下面添加了一个示例

新行用\进行转义,如第二行所示,有没有一种方法可以使用apache spark将其替换为其他字符。

输入CSV

Banana,23,Male,5,11,2017
Cat,32,Fe\
male,2,11,2017
Dragon,28,Male,1,11,2017

预期产量

Banana,23,Male,5,11,2017
Cat,32,Fe-male,2,11,2017
Dragon,28,Male,1,11,2017

注意:原始文件很大(大约40GB)

编辑1 我刚刚找到了使用“ sc.wholeTextFiles”而不是“ sc.textFiles”的答案,但是由于尺寸太大,我不确定它是否可以提高内存效率,请告知

2 个答案:

答案 0 :(得分:1)

您在这里!

Python函数:

def my_func(lista):
    new="\n".join(lista).replace("\\\n", "-").splitlines()
    return new

为您的rdd分区调用此函数:

>>> newrdd = sc.textFile(PATH_TO_FILE).mapPartitions(my_func).map(lambda line : line.split(","))
>>> newrdd.take(5);
[[u'Banana', u'23', u'Male', u'5', u'11', u'2017'], [u'Cat', u'32', u'Fe-male', u'2', u'11', u'2017'], [u'Dragon', u'28', u'Male', u'1', u'11', u'2017']]

现在将此输入文件加载到数据框中:

newdf  = sc.textFile(PATH_TO_FILE).mapPartitions(my_func).map(lambda line : line.split(",")).toDF(['Col1','Col2','Col3','Col4','Col5','Col5'])

>>> newdf.show();
+------+----+-------+----+----+----+
|  Col1|Col2|   Col3|Col4|Col5|Col5|
+------+----+-------+----+----+----+
|Banana|  23|   Male|   5|  11|2017|
|   Cat|  32|Fe-male|   2|  11|2017|
|Dragon|  28|   Male|   1|  11|2017|
+------+----+-------+----+----+----+

我猜您正在期待与此类似的解决方案。让我知道您是否正在寻找其他东西。我可以根据要求调整功能:-)

答案 1 :(得分:0)

经过研究和解决,这才是我来

如答案中的@ vikrant-rana所示, 尝试使用sc.textFile()读取并在分区上进行映射是一种尝试的方法,但是由于我们需要合并的行可能会转到不同的分区,因此这不是一个可靠的解决方案。 有时当它们位于同一分区上时可能会起作用,但并不总是起作用

我们也可以使用sc.wholeTextFiles()将文件读入单个分区并在其上进行映射,但这会立即将整个文件读入内存,不适用于大文件