2016-08-13 10 views
-1

Pysparkの割り当てで苦労しています。チャンネルごとにすべての視聴数の合計を取得する必要があります。私は2セットのファイルを持っています。1つはショーを表示し、1つはショーごとに表示し、もう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] 

はまた、これはあなたがデータを形成不明な場合でしょう複雑になりますのでご注意しますtake - つまり、オブジェクトに2つのアイテムがある場合もあれば、それ以外の3つのアイテムがある場合もあります。その場合、ループのために一般化された方法でアンパックとインデックスを作成するには、もう少し考えが必要です。

+0

クイックレスポンスJeffに感謝します。私の関数でそのコードを使用すると、エラー "TypeError: '型'オブジェクトが反復可能ではありません。私のPythonの知識はあまり良くありませんので、私はオンラインでもう少し研究を行い、データをループするいくつかのPysparkの例を見つけます。しかし、反復可能ではないオブジェクトは何ですか?私は自分の関数が引数として別のRDDの1行しか取らないと思ったのですが、なぜそれが反復不可能であると言っているのでしょうか? – chucknor

+0

あなたの例で言及している 'your_list'は私の関数がとる引数なので、私の場合は 'show_chan_views'ですか?私が以下のコードを試してみると、3行目の '値が大きすぎて解凍しません'というエラーが出ます。 [96]:def extract_chan_views(show_chan_views): ....:show_chan_viewsのアイテム: ....:first_index、second_index = item ....:first_sub_index、second_sub_index = second_index ....:return(first_sub_index、second_sub_index) – chucknor

+0

最初のエラーは、forループで何をしようとしていても、反復できるものではないことを示しています。それが何であるかを確認してください。 2番目のエラーは、オブジェクトに3つの変数がある場合など、2つの変数に展開しようとしていることを意味します。 – Jeff

関連する問題