繁体   English   中英

如何将 Spark RDD 中的 Key/sequence 对分解为 Key/Value 对?

[英]How to break the Key/sequence pairs in Spark RDDs into Key/Value pairs?

我有一个这种格式的 RDD:

(key, [v1, v2, v3, ..., vn])

我想把它转换成这样的 RDD:

(key, v1), (key, v2), ..., (key, vn)

为了详细说明,我使用sc.wholeTextFile(dir)读取dir目录中的所有文本文档,RDD 将是这样的: (document, content) 我想把它转换成这样的 RDD: (document, word) 换句话说,我想将文档信息保留在 RDD 中。

我使用RDD.flatMap(lambda (document, text): (document, re.split(' '), text))将文本拆分为单词,但找不到将单词序列分解为单独元素的方法.

在 Scala 中使用case似乎更直观。 反正。

在pyspark中:

%python
files = sc.wholeTextFiles("/FileStore/tables/x*.txt",0).map(lambda x: (x[0],x[1].replace('?',' ').replace('.',' ').replace('\r',' ').replace('\n',' ')  )) 
wordsAndFile = files.map(lambda k_v: (k_v[0], k_v[1].split(" ")))
res = wordsAndFile.map(lambda k_v: [(k_v[0], x) for x in k_v[1]])
final = res.flatMap(lambda x: x).filter(lambda x: x[1] is not u'')
final.collect()

使用 3 个文件我得到了这个,部分显示:

Out[129]: [('dbfs:/FileStore/tables/x1.txt', 'Hi'),
('dbfs:/FileStore/tables/x1.txt', 'how'),
('dbfs:/FileStore/tables/x1.txt', 'are'),
('dbfs:/FileStore/tables/x1.txt', 'you'),
('dbfs:/FileStore/tables/x1.txt', 'I'),
('dbfs:/FileStore/tables/x1.txt', 'am'),
('dbfs:/FileStore/tables/x1.txt', 'fine'),
('dbfs:/FileStore/tables/x1.txt', '3rd'),
('dbfs:/FileStore/tables/x1.txt', 'line'),
('dbfs:/FileStore/tables/x2.txt', 'John'),
('dbfs:/FileStore/tables/x2.txt', 'I'),
('dbfs:/FileStore/tables/x2.txt', 'am'),
...
...

只是为了优点,带有大小写的 Scala 方法更容易并且更少 \\r, \\n 东西。 没有应用replaceAll,只是为了证明这一点:

val files = sc.wholeTextFiles("/FileStore/tables/x*.txt",0) 
val lines2 = files.map { case (x, y) =>  (x, y.split(" ")) }
val lines3 = lines2.flatMap {  case (k, v) => { v.map(x => (k,x))    }  }
lines3.collect

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM