【问题标题】:pyspark: difference between using (,) and [,] for pair representation for reducedByKeypyspark:使用 (,) 和 [,] 来表示 reduceByKey 的区别
【发布时间】:2016-09-26 21:27:33
【问题描述】:

我正在使用 pyspark 在 RDD 上应用映射,然后进行 reduceByKey 转换。我尝试了以下两种语法,它们似乎都有效:

案例一:

my_rdd_out = my_rdd.map(lambda r: [r['my_id'], [[r['my_value']]]])\
                                .reduceByKey(lambda a, b: a+b)\
                                .map(lambda r: r[1])

案例2:

my_rdd_out = my_rdd.map(lambda r: (r['my_id'], [[r['my_value']]]))\
                                .reduceByKey(lambda a, b: a+b)\
                                .map(lambda r: r[1])

这里的 r 属于 from pyspark.sql import Row 类。 在情况 1 中,地图输出对在括号中;在情况 2 中,地图输出对在括号中。虽然两者都有效,但我想知道使用 [] 和 () 来表示稍后将成为 reduceByKey 输入的一对有什么区别吗?谢谢!

【问题讨论】:

    标签: python lambda row pyspark


    【解决方案1】:

    tuple 和 python 中的list 之间的区别在于tuple 对象是不可变的,因此它们是可散列的。 list 对象不可散列,因为它们可以使用它们的引用进行修改。

    在您的情况下,您可以使用它们中的任何一个(或者reduceByKey 方法不适用于元组和列表),当您从某个调用者那里获取对象时避免将一个对象转换为另一个对象只是一种方便(方法只需要遍历集合,不关心是什么集合)。

    这是从here 提升的reduceByKey 的实现

    def reduceByKey(func, iterable):
        """Reduce by key.
        Equivalent to the Spark counterpart
        Inspired by http://stackoverflow.com/q/33648581/554319
        1. Sort by key
        2. Group by key yielding (key, grouper)
        3. For each pair yield (key, reduce(func, last element of each grouper))
        """
        get_first = lambda p: p[0]
        get_second = lambda p: p[1]
        # iterable.groupBy(_._1).map(l => (l._1, l._2.map(_._2).reduce(func)))
        return map(
            lambda l: (l[0], reduce(func, map(get_second, l[1]))),
            groupby(sorted(iterable, key=get_first), get_first)
        )
    

    在您的示例中,您有tuple(<something>).reduceByKey(lambda <something>)。显然,可迭代的是tuplefunc是lambda表达式。

    如您所见,输入只需要是可迭代的。甚至不需要索引访问。

    你可以通过setdeque、生成器推导等等。它不包含任何到列表或元组的转换。

    它甚至不需要同时获取所有数据,一次只需要一个(生成器函数/理解也可以):避免创建无用的临时对象的优雅方式。

    这要求iterable 在函数中只迭代一次,这里的sorted 函数就是这种情况,它会生成list

    【讨论】:

    • 那么 reduceByKey 在执行 reduceByKey 之前实际上是否将列表转换为元组?哪种格式更正式/标准?谢谢!
    • 查看我的编辑(需要编辑,非常感谢)。没有演员表。并根据方便选择您的格式。对于仅为调用函数而创建的元组/列表,很难选择,我同意。
    • 您好 Jean-Francois,感谢您提供详细信息。我试图了解 def reduceByKey(func, iterable) 的实现。在我的示例中,func 和 iterable 应该是什么:reduceByKey(lambda a, b: a+b)?非常感谢!
    • 已编辑。在您的示例中,您有 tuple(something).reduceByKey(lambda something)。显然,iterable 是元组,函数是 lambda 表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2022-01-06
    • 2017-05-17
    • 2014-01-31
    • 2015-10-02
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多