请帮助我理解在数据集上使用时传递给groupByKey的参数
scala> val data = spark.read.text("Sample.txt").as[String]
data: org.apache.spark.sql.Dataset[String] = [value: string]
scala> data.flatMap(_.split(" ")).groupByKey(l=>l).count.show
在上面的代码中,请帮助我理解groupByKey(l => l)中的(l => l)含义。
答案 0 :(得分:9)
l => l表示使用整个字符串(在您的情况下,每个单词,因为您在空间上进行标记)将用作键。这样,您可以在同一个分区中获得每个单词的所有出现,并且可以对它们进行计数。 - 正如您在其他文章中看到的那样,在这种情况下最好使用reduceByKey,这样您就不需要在计算之前收集内存中每个键的所有值。
API Docs始终是一个好的起点: 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,其中数据按给定的键函数分组。
您需要一个从数据集数据中获取密钥的函数。
在您的示例中,您的函数按原样获取整个字符串并将其用作键。对于数据集[String],另一个示例是将字符串的前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个值。
以下是关键变换与(l => l)相比的差异所以你可以看得更清楚:
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|
+------+--------+