databricks中的pyspark - 一次性替换RDD中每个元素的分隔符和字符串

时间:2018-01-14 20:59:15

标签: pyspark rdd

当我尝试做以下简单的事情时,我感到很愚蠢:我正在使用dataset / databricks-datasets / cs110x / ml-1m / data-001,其中包含3个带有关于用户,电影的信息的dat文件和他们的评级。

RDD就像10个条目的样本:

[u'1::F::1::10::48067',
 u'2::M::56::16::70072',
 u'3::M::25::15::55117',
 u'4::M::45::7::02460',
 u'5::M::25::20::55455',
 u'6::F::50::9::55117',
 u'7::M::35::1::06810',
 u'8::M::25::12::11413',
 u'9::M::25::17::61614',
 u'10::F::35::1::95370']

我试图取代似乎是分隔符' ::'另一方面,将M替换为1,将F替换为0,这是性别。

myRDD.map(lambda x: x.replace('::',',')).map(lambda x: x.replace('M','0')).map(lambda x: x.replace('F','1'))

但它没有做任何事情,我得到相同的RDD没有任何变化没有错误。是否有一种调试器可以看看幕后发生了什么?这个简单的事情让我发疯。知道我做错了什么吗?如果我采用RDD的1个元素,它可以工作。 感谢

1 个答案:

答案 0 :(得分:0)

你的代码工作正常,但你必须记住它是懒惰的:

>>> myRDD = sc.parallelize([u'1::F::1::10::48067',
...  u'2::M::56::16::70072',
...  u'3::M::25::15::55117',
...  u'4::M::45::7::02460',
...  u'5::M::25::20::55455',
...  u'6::F::50::9::55117',
...  u'7::M::35::1::06810',
...  u'8::M::25::12::11413',
...  u'9::M::25::17::61614',
...  u'10::F::35::1::95370'])
...  
>>> transformedRDD = myRDD.map(lambda x: x.replace('::',',')).map(lambda x: x.replace('M','0')).map(lambda x: x.replace('F','1'))
>>> 
>>> for x in transformedRDD.collect():
...     print(x)
...     
1,1,1,10,48067                                                                  
2,0,56,16,70072
3,0,25,15,55117
4,0,45,7,02460
5,0,25,20,55455
6,1,50,9,55117
7,0,35,1,06810
8,0,25,12,11413
9,0,25,17,61614
10,1,35,1,95370
>>> 

通常你不会收集但是会调用其中一个分布式操作。我强烈建议您在开始编写自己的程序之前熟悉the programming guide