2016-11-26 72 views
-1
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]pyspark中这个spark代码(scala)的等效表达式是什么?

另外,为什么要写出像x:(Int,Int)这样的类型?我必须在pyspark做类似的事吗?

回答

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的duck typing理念,您只需关心支持您使用的操作符(索引和添加)的任何内容。现在你仍然可以给type hints,但是你不需要。

正如你所说的,在Python元组索引与[i]完成的,所以你完整的代码看起来像:

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

一般来说,这些问题表明你有一些阅读了做一下斯卡拉和Python,差异强/弱,动态/静态打字等。 – sgvd

+0

非常感谢!我也看到了Scala中的类型转换,比如'val(totalUnigramsFG,_)= processedUnigrams.map {x =>(x._2._1.toLong,x._2._2.toLong)} .reduce {(x: (Long,Long),y:(Long,Long))=>(x._1 + y._1,x._2 + y._2)}',我必须在Python中明确地做到这一点吗? – xxx222

+0

我假设我们也不需要在pyspark中使用'.toLong'? – xxx222

相关问题