scala - 使用 Spark SQL GROUP BY 对 DataFrame 进行高效的 PairRDD 操作

标签 scala apache-spark apache-spark-sql rdd

这个问题是关于聚合操作时DataFrameRDD之间的对偶性。在 Spark SQL 中,可以使用表生成 UDF 进行自定义聚合,但创建其中之一通常明显不如使用可用于 RDD 的聚合函数方便用户,尤其是在不需要表输出的情况下。

是否有一种有效的方法可以将诸如aggregateByKey之类的对RDD操作应用于已使用GROUP BY分组或使用ORDERED BY排序的DataFrame?

通常,需要一个显式的 map 步骤来创建键值元组,例如 dataFrame.rdd.map(row => (row.getString(row.fieldIndex("category")), row).aggregateByKey(...)。可以避免这种情况吗?

最佳答案

不是真的。虽然 DataFrames 可以转换为 RDD,反之亦然,但这是相对复杂的操作,并且像 DataFrame.groupBy 这样的方法不具有与RDD 上的对应项。

你能得到的最接近的是a new DataSet API Spark 1.6.0 中引入。它通过自己的一组方法(包括 reducecogroup map 组:

case class Record(id: Long, key: String, value: Double)

val df = sc.parallelize(Seq(
    (1L, "foo", 3.0), (2L, "bar", 5.6),
    (3L, "foo", -1.0), (4L, "bar", 10.0)
)).toDF("id", "key", "value")

val ds = df.as[Record]
ds.groupBy($"key").reduce((x, y) => if (x.id < y.id) x else y).show

// +-----+-----------+
// |   _1|         _2|
// +-----+-----------+
// |[bar]|[2,bar,5.6]|
// |[foo]|[1,foo,3.0]|
// +-----+-----------+

在某些特定情况下,可以利用Orderable语义来使用结构数组对数据进行分组和处理。您可以在 SPARK DataFrame: select the first row of each group 中找到示例。

关于scala - 使用 Spark SQL GROUP BY 对 DataFrame 进行高效的 PairRDD 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31780677/

相关文章:

scala:方法的返回值并过早地结束该方法

apache-spark - 在 Spark 上配置单元 : java. lang.NoClassDefFoundError: org/apache/hive/spark/client/Job

scala - 不支持的文字类型类 scala.runtime.BoxedUnit

Scala私有(private)函数

scala - Spark 2.0 ALSRecommendation 如何向用户推荐

scala - 使用 scalamock 在 scala 中使用 ClassTag 的模拟方法

apache-spark - 随机数在 Spark 中的表现如何

scala - 在spark中使用正则表达式

apache-spark - 如何使用变换高阶函数?

python - 在 Pandas/Pyspark 中比较 2 个数据帧、分配标签并拆分行