了解 Spark for RDD 中的 lambda 函数输入



我正在做一个关于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这意味着减少具有相同键名的值。因此,xy将表示两个项目的键值,此操作仅适用于具有相同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时,它会按键对结果进行排序。

最新更新