2016-08-13 3 views
-1

Я борюсь с назначением Pyspark. Мне нужно получить сумму всех номеров просмотра на каждый канал. У меня есть 2 набора файлов: 1 показывает показ и просмотры на показ другого, показывающего шоу и на каком канале они отображаются (может быть несколько).Объект Pyspark tuple не имеет атрибута split

Я выполнил операцию объединения на 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 для суммирования результатов. Однако, когда я пытаюсь отобразить результаты ниже функции с Collect() я получаю «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')), 

список кортежей, где первый индекс является строкой Юникода, а второй является другой кортеж. Вы можете разделить их друг от друга, как это (я аннотировать каждый шаг с комментариями):

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 - то есть, если иногда объекты имеют два элемента в них, другие три раза. В этом случае распаковка и индексирование в обобщенном виде для цикла требуют немного большего понимания.

+0

Спасибо за быстрый ответ Джефф. Когда я использую этот код в своей функции, я получаю сообщение об ошибке: «ТипError:« type »object is is iterable». Мои знания Python невелики, поэтому я сделаю немного больше исследований в Интернете и найду некоторые примеры Pyspark, которые будут проходить через данные. Но что такое объект, который не является итерируемым. Я думал, что моя функция принимает только одну строку другого RDD в качестве аргумента, поэтому почему он говорит, что это не повторяется? – chucknor

+0

Является ли «ваш_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', не может повторяться. Сначала проверьте, что это такое. Вторая ошибка означает, что вы пытаетесь распаковать, например, две переменные, когда ваш объект имеет три. – Jeff