2016-11-26 71 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

相關問題