我正在做一个关于Spark的课程,我有点困惑。
所以有下面的代码。我知道第 1 行正在创建元组(单词,1(。然后第 2 行按单词分组并对计数求和。
我不明白的是,X 和 Y 在第 2 行中是什么。lamda 函数只有一个数字输入,即字数统计中的计数列(所有 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()
1. 为什么是 x 和 y?
创建一个键值对,例如(单词,1(
现在你的键将是单词,值将是1
当你做reduceByKey时,它会把同一个键的所有值相加。
reduceByKey(lambda x, y: x + y)
将按键对rdd元素进行分组,键是第一个元素word
,并汇总值。在这个特定的语句中,x 是一个累积 RDD 所有值的元素,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')]
希望这有帮助
第一个 Lambda - lambda x: (x, 1(
在第一步中,输入将如下所示
['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
或该键的分组值(即词频(。
> @kikee1222,
@Sampath和@pissal为您提供了所有问题的详细说明,我认为我们缺少一(x(个参数的关键点,就像累加器一样
我不明白的是,X 和 Y 在第 2 行中是什么。lamda 函数只有一个数字输入,即字数统计中的计数列(所有 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
希望这有帮助
x 和 y 是临时变量,就像 java 中的 for 循环一样。 因此,您可以拥有任何变量名称。当您执行sortByKey
时,它会按键对结果进行排序。