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 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找到一个例子 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |