背景:
我目前有大文件上传到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的新手,所以不确定从哪里开始。我已经尝试过map
,flatMap
和reduce
,但这似乎不是我想要的,因为它们似乎只使用当前行,或者将所有行合并为一个。我在SO上找到的最接近的是使用sliding
函数的this post,但问题与我要实现的目标有点不同,我找不到关于该目标的任何文档在pyspark中,只有scala。
欢迎提出其他建议,说明如何使用其他可在AWS胶水中实现的,不涉及流数据集的工具来解决新行问题。 (文件太大,无法容纳在内存中)
答案 0 :(得分:0)
我设法解决了问题
apply(df, 1, function(x) sum(!is.na(intersect(x[friend_cols], x[bully_cols]))))
我上面唯一想到的问题是不正确的行数是否会超过内存容量(不太可能)或者第一列或最后一列有换行符(不太可能在我的文件中)