加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 使用Spark SQL GROUP BY对DataFrame进行高效的PairRDD

发布时间:2020-12-16 08:44:38 所属栏目:安全 来源:网络整理
导读:这个问题是关于聚合操作时DataFrame和RDD之间的二元性.在Spark SQL中,可以使用表生成UDF进行自定义聚合,但创建其中一个UDF通常明显不如使用RDD可用的聚合函数,特别是如果不需要表输出. 是否有一种有效的方法将聚合RDD操作(例如aggregateByKey)应用于已使用GR
这个问题是关于聚合操作时DataFrame和RDD之间的二元性.在Spark SQL中,可以使用表生成UDF进行自定义聚合,但创建其中一个UDF通常明显不如使用RDD可用的聚合函数,特别是如果不需要表输出.

是否有一种有效的方法将聚合RDD操作(例如aggregateByKey)应用于已使用GROUP BY分组或使用ORDERED BY进行排序的DataFrame?

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

解决方法

并不是的.虽然DataFrames可以转换为RDD,反之亦然,但这是相对复杂的操作,而像DataFrame.groupBy这样的方法与RDD上的对应物没有相同的语义.

最接近的事情是在Spark 1.6.0中引入a new DataSet API.它提供了与DataFrames和GroupedDataset类更紧密的集成,以及它自己的一组方法,包括reduce,cogroup或mapGroups:

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

val df = sc.parallelize(Seq(
    (1L,"foo",3.0),(2L,"bar",5.6),(3L,-1.0),(4L,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找到一个例子

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读