groupByKey Spark中数据集

问题描述:

请帮助我了解,我们传递给groupByKey参数时,它是在一个数据集groupByKey Spark中数据集

​​

用在上面的代码,请帮助我了解(L => -1)是指在groupByKey (L => 1)。

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| 
+------+--------+