Pyspark RDD将当前行与下一行合并,直到当前行长达到x

时间:2018-12-19 05:35:56

标签: python apache-spark pyspark

背景

我目前有大文件上传到AWS S3,这些文件在某些​​列中包含换行符,这导致它们无法正确读取。但是,文件确实具有非常特定的列分隔符~#~。为了删除不正确的换行符,我目前正在通过aws胶流式传输文件,如果当前行没有应有的列数,则将每一行与下一行合并。

示例:

上一行:"val1"~#~"va\nl\n2"~#~"val3",它像这样显示

"val1"~#~"va
l
2"~#~"val3"

使用以下命令逐行进行:

colnum=3
for row in f:
    while not len(row.split('~#~'))==colnum:
        row += next(f)
cleanrow = row.replace('\n','. ')+'\n

cleanrow示例将在一行上返回该示例,例如预期的输出

"val1"~#~"va. l. 2"~#~"val3"

问题:

当前,即使计算机位于AWS网络上,通过计算机流式传输这些大文件以清理它们也花费了太长时间。因此,我已经考虑使用pyspark进行此操作,我尝试设置像这样的spark._jsc.hadoopConfiguration().set("textinputformat.record.delimiter","\"\n")自定义换行符,但问题是事实证明我们也可以在文本字段中使用'"\n',表示并非所有行都固定。我是pyspark的新手,所以不确定从哪里开始。我已经尝试过mapflatMapreduce,但这似乎不是我想要的,因为它们似乎只使用当前行,或者将所有行合并为一个。我在SO上找到的最接近的是使用sliding函数的this post,但问题与我要实现的目标有点不同,我找不到关于该目标的任何文档在pyspark中,只有scala。

欢迎提出其他建议,说明如何使用其他可在AWS胶水中实现的,不涉及流数据集的工具来解决新行问题。 (文件太大,无法容纳在内存中)

1 个答案:

答案 0 :(得分:0)

我设法解决了问题

apply(df, 1, function(x) sum(!is.na(intersect(x[friend_cols], x[bully_cols]))))

我上面唯一想到的问题是不正确的行数是否会超过内存容量(不太可能)或者第一列或最后一列有换行符(不太可能在我的文件中)