这个问题是关于聚合操作时DataFrame
和RDD
之间的对偶性。在 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 中引入。它通过自己的一组方法(包括 reduce
、cogroup
或 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/