groupByKey Spark中数据集
问题描述:
请帮助我了解,我们传递给groupByKey参数时,它是在一个数据集groupByKey Spark中数据集
用在上面的代码,请帮助我了解(L => -1)是指在groupByKey (L => 1)。
答
l => l表示使用整个字符串(在你的情况下,当你在空间上进行标记时,每个单词都将被用作关键字)。通过这种方式,您可以在同一分区中获得每个单词的所有出现次数,并可以对它们进行计数 - 正如您在其他文章中可能看到的那样,在这种情况下最好使用reduceByKey,因此在计数之前不需要为内存中的每个键收集所有值。
-
总是一个良好的开端是API文档: http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset
DEF groupByKey [K](FUNC:(T)⇒K)(隐式为arg0:编码器[K]):KeyValueGroupedDataset [ K,T] (Scala特有的)返回一个KeyValueGroupedDataset,其中数据按给定的键func分组。
您需要一个从数据集的数据派生您的密钥的函数。
在您的示例中,您的函数将原样使用整个字符串并将其用作关键字。一个不同的例子将是,对于一个数据集[字符串],以作为密钥使用的字符串的前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|
+------+--------+