了解RDD中Spark的Lambda函数输入

问题描述 投票:1回答:4

我正在学习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()
python apache-spark lambda pyspark
4个回答
0
投票

0
投票
[第一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或该键的分组值(即字频)。


0
投票
[使像(word,1)这样的键值对

现在您的键将是单词,值将是1

当您执行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')]

0
投票
@@ Sampath和@pissal为您提供了所有问题的详细说明,我认为我们缺少一个(x)参数的关键点,就像累加器一样。

我不明白的是,第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

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.