Spark数据集中的groupByKey

时间:2017-02-16 18:41:04

标签: apache-spark apache-spark-dataset

请帮助我理解在数据集上使用时传递给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)含义。

1 个答案:

答案 0 :(得分:9)

l => l表示使用整个字符串(在您的情况下,每个单词,因为您在空间上进行标记)将用作键。这样,您可以在同一个分区中获得每个单词的所有出现,并且可以对它们进行计数。   - 正如您在其他文章中看到的那样,在这种情况下最好使用reduceByKey,这样您就不需要在计算之前收集内存中每个键的所有值。

您需要一个从数据集数据中获取密钥的函数。

在您的示例中,您的函数按原样获取整个字符串并将其用作键。对于数据集[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|
+------+--------+