2016-08-13 75 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

相关问题