【问题标题】:Understanding lambda function inputs in Spark for RDDs了解 Spark for RDD 中的 lambda 函数输入
【发布时间】:2019-10-21 20:44:05
【问题描述】:

我正在上 Spark 的课程,我有点困惑。

所以有下面的代码。我知道第 1 行正在创建元组(单词,1)。然后第 2 行按单词分组并对计数求和。

我不明白的是,第 2 行中的 X 和 Y 是什么。我们只有一个数字输入到 lamda 函数,即 wordcounts 中的计数列(全为 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


    【解决方案1】:

    1。为什么是 x 和 y?

    制作一个键值对,例如 (word, 1)

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

    当你做 reduceByKey 时,它会将同一个键的所有值相加

    reduceByKey(lambda x, y: x + y) 将通过作为第一个元素word 的键对 rdd 元素进行分组,并将值相加。在这个特定的语句中,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')]
    

    【讨论】:

    • 谢谢@pissall - 所以我想我理解它就像 FOR EACH X sum Y 所以我们在减少时得到键值对?
    • 是的。减少时,对于同一个词,您将总结所有值。
    • @kikee1222 随时。有问题随时联系我
    【解决方案2】:

    希望对你有帮助

    第一个 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 或该键的分组值(即词频)。

    【讨论】:

    • 非常感谢。所以我可以认为每个 X 和 Y 的 x+y 分量是一样的?
    • 是的,我认为您的方法是正确的。如果我可以建议,请探索(理解 + 练习)python lambda 函数 10 - 25 分钟以完全掌握它。
    【解决方案3】:

    @kikee1222,

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

    我不明白的是,第 2 行中的 X 和 Y 是什么。我们只有一个数字输入到 lamda 函数,即 wordcounts 中的计数列(全为 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
    

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      x 和 y 是临时变量,就像 java 中的 for 循环一样。所以,你可以有任何变量名。当您执行sortByKey 时,它会按键对结果进行排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-23
        • 2018-04-08
        • 1970-01-01
        相关资源
        最近更新 更多