2017-07-21 70 views
0

我超级新Python和Spark和我试图通过一个分隔符来删除string内的值。我有以下几行RDD。PySpark RDD列表拆分通过的Delimeter

我喜欢“_”下划线之前删除一切,只保留剩余价值为字符串。我尝试使用下面的这样的东西,但失败了。任何帮助都是极好的。谢谢,我很抱歉,如果我错过任何作为noob的东西。

a.split('_') 
File "<stdin>", line 1, in <module> 
AttributeError: 'dict' object has no attribute 'split' 

# Preferably Something Like This: 
# Before 
a = rdd.take(1)[1] 
a 
{u'bin1_11394071': 1, u'bin1_11052103': 1, u'bin1_11052101': 1} 

# After 
new_a.take(1)[1] 
new_a 
{u'11394071': 1, u'11052103': 1, u'11052101': 1} 

回答

0

使用您输入到重建RDD,我有

rdd.take(2) 
{u'bin1_11394071': 1, u'bin1_11052103': 1, u'bin1_11052101': 1}, {u'bin1_11847272': 1, u'bin1_999999': 1, u'None_11847272': 1}] 

new_rdd = rdd.map(lambda x : {k.split('_')[1]:v for k,v in x.iteritems()}) 
new_rdd.take(2) 
[{u'11394071': 1, u'11052101': 1, u'11052103': 1}, {u'999999': 1, u'11847272': 1}] 

在这里,第二个字典值了, 'bin1_11847272', 'None_11847272',作为键。我们分头走只是数字的一部分之后,他们有相同的价值和词典不能有key.That的多次出现,为什么在new_rdd,我们只有2个值。你必须想出一个处理这个问题的逻辑。

+0

嘿@Suresh,我想上面的代码,它工作时,我用它在一个单一的纪录,但我想在一个RDD每个记录做到这一点。我会显示代码和错误。 #样品1 RDD测试功能记录 a = rdd3.take(1)[0]#测试1个记录的RDD {u'bin1_11394071':1,u'bin1_11052103':1,u'bin1_11052101': 1} #您的功能 new_a = {k.split('_')[1]:v for k,v in a.iteritems()} {u'11394071':1,u'11052101':1 ,u'11052103 ':1} #应用到功能整套RDD(rdd3) rdd4 = {k.split(' _')[1]:v实现K,v在rdd3.iteritems()} AttributeError的: “PipelinedRDD”对象有没有属性“iteritems” – Andre

+0

我提到用我的解决方案,你已经收集了RDD到列表之后。要将它们映射到rdd本身,需要知道rdd是如何的。你可以只用take(2)而不是take(1)[1]来发布你的rdd。 – Suresh

+0

这里是rdd3.take(2)输出:[{u'bin1_11394071 ':1,u'bin1_11052103':1,u'bin1_11052101 ':1},{u'bin1_11847272':10,u'bin1_999999' :1, u'None_11847272':10}] – Andre