2017-07-21 68 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