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做类似的事情?
答案 0 :(得分:1)
在Scala中,语法(x: T) => y
表示匿名函数,其中=>
之前的部分(此处为(x: T)
)确定函数的参数,此后的部分为此y
是返回值。在您的示例中,参数为(x:(Int,Int), y:(Int,Int))
,这意味着该函数采用两个参数x
和y
,两者都应该是整数值的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)