在pyspark中这个火花代码(scala)的等效表达式是什么?

时间:2016-11-26 10:59:16

标签: python scala apache-spark pyspark

val aggregatedBigrams = bigramTokens.reduceByKey({(x:(Int,Int), y:(Int,Int)) => (x._1+y._1, x._2+y._2)}, numReducers)

我已经看到很多火花代码写作如上所述,但我真的很困惑使用下划线,如x._1,我在互联网上搜索并被告知下划线意味着得到的元素一个元组,所以我假设x._1 = x(0),所以在pyspark中,我应该写为x[0]吗?

另外,为什么要写出类似x:(Int,Int)的类型?我是否必须在pyspark做类似的事情?

1 个答案:

答案 0 :(得分:1)

在Scala中,语法(x: T) => y表示匿名函数,其中=>之前的部分(此处为(x: T))确定函数的参数,此后的部分为此y是返回值。在您的示例中,参数为(x:(Int,Int), y:(Int,Int)),这意味着该函数采用两个参数xy,两者都应该是整数值的2元组。返回值是另一个2元组的整数值。

与Python中的Scala匿名函数等效的是lambda函数。使用两个参数定义lambda函数看起来像lambda x, y: ...。 Python并不需要特定的类型,因此您不必明确地将参数类型指定为Scala中的整数元组。实际上,使用Python的鸭子打字哲学,你只关心传递的任何东西都支持你使用的运算符(索引和添加)。你现在仍然可以提供type hints,但你不必这样做。

正如您所说,Python中的元组索引是使用[i]完成的,因此您的完整代码将如下所示:

aggregatedBigrams = bigramTokens.reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1]), numReducers)