我有一个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”的答案,但是由于尺寸太大,我不确定它是否可以提高内存效率,请告知
答案 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()将文件读入单个分区并在其上进行映射,但这会立即将整个文件读入内存,不适用于大文件