2016-08-13 102 views
-1

我在Pyspark任務中掙扎。我需要獲得每個頻道的所有觀看人數的總和。我有兩組文件:1個顯示節目和觀看節目,另一個節目顯示節目和他們顯示的頻道(可以是多個)。Pyspark元組對象沒有屬性拆分

我已經在2個文件進行了連接操作,結果看起來像..

[(u'Surreal_News', (u'BAT', u'11')), 
(u'Hourly_Sports', (u'CNO', u'79')), 
(u'Hourly_Sports', (u'CNO', u'3')), 

我現在需要提取通道爲重點,然後我覺得做一個reduceByKey得到的總和對渠道的看法。

我已經寫了這個函數來提取chan作爲鍵的視圖,然後我可以使用reduceByKey函數來求和結果。然而,當我試圖顯示與收集以下功能的結果()我得到一個「AttributeError的:‘元組’對象有沒有屬性‘分裂’」的錯誤

def extract_chan_views(show_chan_views): 
    key_value = show_chan_views.split(",") 
    chan_views = key_value[1].split(",") 
    chan = chan_views[0] 
    views = int(chan_views[1]) 
    return (chan,views) 

回答

1

因爲這是一個任務,我會盡力解釋發生了什麼,而不是僅僅做出答案。希望這會更有幫助!

這實際上與pySpark無關;這只是一個普通的Python問題。就像錯誤說的那樣,當split是一個字符串操作時,你試圖分割一個元組。而是通過索引訪問它們。你傳遞的對象:

[(u'Surreal_News', (u'BAT', u'11')), 
(u'Hourly_Sports', (u'CNO', u'79')), 
(u'Hourly_Sports', (u'CNO', u'3')), 

是元組,其中第一個指標是Unicode字符串,第二個是另一元組的列表。你可以分開割裂開來是這樣的(我會用註釋評論的每一步):

for item in your_list: 
    #item = (u'Surreal_News', (u'BAT', u'11')) on iteration one 

    first_index, second_index = item #this will unpack the two indices 
    #now: 
    #first_index = u'Surreal_News' 
    #second_index = (u'BAT', u'11') 

    first_sub_index, second_sub_index = second_index #unpack again 
    #now: 
    #first_sub_index = u'BAT' 
    #second_sub_index = u'11' 

注意,你從來沒有在任何地方的逗號分割。另請注意,u'11'是一個字符串,而不是數據中的整數。只要你確定它從來沒有變形,它就可以被轉換,int(u'11')。或者如果你喜歡指定索引來拆包,你可以做同樣的事情:

first_index, second_index = item 

等同於:

first_index = item[0] 
second_index = item[1] 

另外請注意,這得到,如果你不確定更復雜何種形式的數據採取 - 也就是說,如果有時對象有兩個項目,其他時間三個。在這種情況下,以循環的方式對一個循環進行解包和編制索引需要更多的思考。

+0

謝謝傑夫的快速反應。當我在我的函數中使用該代碼時,出現錯誤「TypeError:'type'object is not iterable」。我的Python知識並不好,所以我會在網上做更多的研究,並找到一些Pyspark的例子來循環數據。但是什麼是不可迭代的對象。我認爲我的函數只接受另一個RDD的單行作爲參數,那麼爲什麼它說它不可迭代? – chucknor

+0

是否在你的例子中提到了我的函數需要的參數'your_list',所以在我的例子'show_chan_views'中?當我嘗試下面的代碼時,我得到'太多值解包'的第3行的錯誤。在[96]的:def extract_chan_views(show_chan_views): ....:用於show_chan_views項: ....:FIRST_INDEX,second_index =項 ....:first_sub_index,second_sub_index = second_index ....:return(first_sub_index,second_sub_index) – chucknor

+0

所以你得到的第一個錯誤告訴我們,無論你想在'for'循環中經歷什麼都不是可以迭代的東西。檢查它是什麼。第二個錯誤意味着當你的對象有三個時,你想解壓縮到兩個變量。 – Jeff

相關問題