2017-02-16 84 views
0

請幫助我瞭解,我們傳遞給groupByKey參數時,它是在一個數據集groupByKey Spark中數據集

​​

用在上面的代碼,請幫助我瞭解(L => -1)是指在groupByKey (L => 1)。

回答

5

l => l表示使用整個字符串(在你的情況下,當你在空間上進行標記時,每個單詞都將被用作關鍵字)。通過這種方式,您可以在同一分區中獲得每個單詞的所有出現次數,並可以對它們進行計數 - 正如您在其他文章中可能看到的那樣,在這種情況下最好使用reduceByKey,因此在計數之前不需要爲內存中的每個鍵收集所有值。

您需要一個從數據集的數據派生您的密鑰的函數。

在您的示例中,您的函數將原樣使用整個字符串並將其用作關鍵字。一個不同的例子將是,對於一個數據集[字符串],以作爲密鑰使用的字符串的前3個字符,而不是整個字符串:

scala> val ds = List("abcdef", "abcd", "cdef", "mnop").toDS 
ds: org.apache.spark.sql.Dataset[String] = [value: string] 

scala> ds.show 
+------+ 
| value| 
+------+ 
|abcdef| 
| abcd| 
| cdef| 
| mnop| 
+------+ 

scala> ds.groupByKey(l => l.substring(0,3)).keys.show 
+-----+ 
|value| 
+-----+ 
| cde| 
| mno| 
| abc| 
+-----+ 

組的鍵「ABC」將有2個值。

這裏是關鍵如何被轉化VS的(L => 1),所以你可以看到更好的區別:

scala> ds.groupByKey(l => l.substring(0,3)).count.show 
+-----+--------+ 
|value|count(1)| 
+-----+--------+ 
| cde|  1| 
| mno|  1| 
| abc|  2| 
+-----+--------+ 


scala> ds.groupByKey(l => l).count.show 
+------+--------+ 
| value|count(1)| 
+------+--------+ 
| abcd|  1| 
| cdef|  1| 
|abcdef|  1| 
| mnop|  1| 
+------+--------+