我正在学习Spark课程,我有点困惑。
所以有以下代码。我知道第一行正在创建元组(word,1)。然后,第2行按单词分组并累加计数。
我不明白的是,第2行中的X和Y是什么。我们只有一个数字输入lamda函数,它是wordcounts中的count列(全为1,所以为什么是y?
wordCounts = words.map(lambda x: (x, 1)) #outputs [('self', 1), ('employment', 1), ('building', 1)...
wordCounts2 = wordCounts.reduceByKey(lambda x, y: x + y) # outputs [('self', 111), ('an', 178), ('internet', 26)
然后,我们有这段代码紧随其后。我了解它可以对RDD进行排序。确认我的理解是X [1]这个词和X [2]这个总数吗?我想是这样,但我不是100%
对不起,我很愚蠢,但我找不到清晰的解释!
wordCountsSorted = wordCounts2.map(lambda x: (x[1], x[0])).sortByKey()
在第一步中,输入将在下面显示
['self', 'employment', 'building',
'self', 'employment', 'building',
'self', 'employment', 'building',
'self', 'employment' ]
这里,您的第一个lambda函数将上述列表中的每个项目都隐蔽到对应位置中的以下项目。
data = [('self', 1), ('employment', 1), ('building', 1),
('self', 1), ('employment', 1), ('building', 1),
('self', 1), ('employment', 1), ('building', 1),
('self', 1), ('employment', 1) ]
此lambda与以下相同
def convert_word_to_key_value(word):
return (word, 1)
示例:
['self'
转换为('self',
)`此lambda的目标是将每个单词转换为看起来像(键,值)元组。
第二Lambda-lambda x,y:x + y
此lambda的目标是对单词进行分组,即使用相同的键累积值。
请注意,我们正在使用
reduceByKey
,这意味着要减少具有相同键名的值。因此x
和y
将代表两个项目的键值,并且此操作仅对具有相同key
的项目进行例如,如果有两个如下所示的元组
('self', 1),('self', 1)
将变成('self', 2)
第二个例子
('self', 2),('self', 1)
将变成('self', 1)
第三示例
('self', 12),('self', 15)
将变成('self', 27)
您的最后一部分
wordCountsSorted = wordCounts2.map(lambda x: (x[1], x[0])).sortByKey()
[(key, value)
变为(value, key)
示例(说)
[
('self', 1231)
变为(1231, 'self')
现在,您正在根据键对项目进行排序,采用这种新格式,即
1231
或该键的分组值(即字频)。
当您执行reduceByKey时,它将为同一键添加所有值
reduceByKey(lambda x, y: x + y)
将按作为第一个元素word
的键将rdd元素分组,并对这些值求和。在此特定声明中,x是RDD的一个元素,而y是另一个。减少相同单词或相同键的值(x表示一个元素,y表示另一个元素)。可能看起来像:
# [('This', 1), ('is', 2), ('a', 3), ('random', 1), ('sample.', 2), ('And', 2), ('world', 1), ('count', 2), ('word', 1), ('sample,', 1), ('that', 1), ('it', 1)]
2。让我们细分关于wordCountsSorted = wordCounts2.map(lambda x: (x[1], x[0])).sortByKey()
的下一个问题
下一行将交换元组的元素。本质上,位置0的元素将移动到位置1,位置1的元素将移动到位置0。
reversed_tup = wordCounts2.map(lambda x: (x[1], x[0]))
输出看起来像;
# [(1, 'This'), (2, 'is'), (3, 'a'), (1, 'random'), (2, 'sample.'), (2, 'And'), (1, 'world'), (2, 'count'), (1, 'word'), (1, 'sample,'), (1, 'that'), (1, 'it')]
现在,当您执行sortByKey
时,将使用键来对这些元组进行排序,该键如上所述。因此,rdd将按字数排序。
wordCountsSorted = reversed_tup.sortByKey()
wordCountsSorted.collect()
# [(1, 'This'), (1, 'random'), (1, 'world'), (1, 'word'), (1, 'sample,'), (1, 'that'), (1, 'it'), (2, 'is'), (2, 'sample.'), (2, 'And'), (2, 'count'), (3, 'a')]
我不明白的是,第2行中的X和Y是什么。我们只有一个数字输入lamda函数,它是wordcounts中的count列(全为1,所以为什么是y?
wordCounts2 = wordCounts.reduceByKey(lambda x, y: x + y) # outputs [('self', 111), ('an', 178), ('internet', 26)
在这里,您可以将x视为累加器,并将y计数。累加器以0初始化,并为每个键累加计数,并产生键的最终计数]
[('a', 1), ('b', 1), ('c',1), ('b',1), ('a',1), ('a',1)]
应用
reduceByKey ( lambda accum, count : accum + count)
之后您可以想到这样的迭代
#1 : accum = 0 , count = 1 =>(returns) 1 #2 : accum = 1, count = 1 => 2 #3 : accum = 2, count = 1 => 3
希望这会有所帮助