2016-08-13 6 views
-1

Ich kämpfe mit einem Pyspark-Auftrag. Ich bin verpflichtet, eine Summe aller Anzeigezahlen pro Kanal zu erhalten. Ich habe 2 Sätze von Dateien: 1 zeigt die Show und Ansichten pro Show, die andere zeigt die Shows und welchen Kanal sie angezeigt werden (kann mehrere sein).Pyspark Tupel-Objekt hat keine Attributaufteilung

Ich habe eine Join-Operation auf den 2-Dateien durchgeführt und das Ergebnis sieht aus wie ..

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

Ich muss jetzt den Kanal als Schlüssel extrahieren und dann denke ich, eine reduceByKey tun, um die Summe zu erhalten Ansichten für die Kanäle.

Ich habe diese Funktion geschrieben, um den Chan als Schlüssel mit den Ansichten neben zu extrahieren, die ich dann eine reduceByKey-Funktion verwenden könnte, um die Ergebnisse zu summieren. Jedoch wenn ich versuche, mit collect Ergebnisse von unten Funktion anzuzeigen() Ich erhalte ein „Attribut:‚tuple‘Objekt hat kein Attribut‚split‘“ Fehler

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) 

Antwort

1

Da dies eine Aufgabe ist, werde ich versuchen, um zu erklären, was vor sich geht, anstatt nur die Antwort zu geben. Hoffentlich wird das hilfreicher sein!

Das ist eigentlich nichts mit pySpark zu tun; Es ist nur ein einfaches Python-Problem. Wie der Fehler sagt, versuchen Sie ein Tupel zu teilen, wenn split eine Zeichenfolgeoperation ist. Greifen Sie stattdessen auf sie nach Index zu. Das Objekt, das Sie vorbei in:

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

ist eine Liste von Tupeln, wobei der erste Index ist ein Unicode-String und der zweite ist ein weiteres Tupel. Sie können sie wie folgt aufgeteilt auseinander (Ich werde jeden Schritt mit Kommentaren mit Anmerkungen versehen):

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' 

Beachten Sie, dass Sie nie irgendwo auf Kommas aufzuteilen hatte. Beachten Sie auch, dass die u'11' eine Zeichenfolge ist, keine Ganzzahl in Ihren Daten. Es kann konvertiert werden, solange Sie sicher sind, dass es nie fehlerhaft ist, mit int(u'11'). Oder wenn Sie bevorzugen Indizes Auspacken angeben, können Sie das gleiche tun:

first_index, second_index = item 

entspricht:

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

Beachten Sie auch, dass dies komplizierter wird, wenn Sie sich nicht sicher sind, welche Form die Daten nehmen - das heißt, wenn manchmal die Objekte zwei Gegenstände in ihnen haben, andere mal drei. In diesem Fall erfordert das generalisierte Auspacken und Indexieren für eine Schleife ein wenig mehr Nachdenken.

+0

Danke für die schnelle Antwort Jeff. Wenn ich diesen Code in meiner Funktion verwende, bekomme ich den Fehler "TypeError: 'type' Objekt ist nicht iterierbar". Mein Python-Wissen ist nicht großartig, deshalb werde ich ein bisschen mehr online recherchieren und einige Pyspark-Beispiele finden, die Daten durchlaufen. Aber was ist das Objekt, das nicht iterierbar ist? Ich dachte, dass meine Funktion nur eine einzige Zeile einer anderen RDD als Argument nimmt, also warum sagt sie, dass sie nicht iterierbar ist? – chucknor

+0

Ist die 'your_list' in Ihrem Beispiel das Argument, das meine Funktion annimmt, also in meinem Fall 'show_chan_views'? Wenn ich den folgenden Code versuche, bekomme ich den Fehler in Zeile 3 von 'Zu viele Werte zum Entpacken'. In [96]: def extract_chan_views (show_chan_views): ....: für Artikel in show_chan_views: ....: first_index, second_index = Artikel ....: first_sub_index, second_sub_index = second_index ....: return (first_sub_index, second_sub_index) – chucknor

+0

Der erste Fehler, den Sie bekommen, sagt uns, dass alles, was Sie in der 'for' -Schleife durchgehen wollen, nicht durch iteriert werden kann. Überprüfe, was es zuerst ist. Der zweite Fehler bedeutet, dass Sie versuchen, zum Beispiel zwei Variablen zu entpacken, wenn Ihr Objekt drei hat. – Jeff

Verwandte Themen