数据集上的Spark aggregateByKey

时间:2016-08-25 04:05:53

标签: scala apache-spark apache-spark-sql spark-streaming spark-dataframe

Here是由@ bbejeck

写的mutable.HashSet [String]上的aggregateByKey示例
val initialSet = mutable.HashSet.empty[String]
val addToSet = (s: mutable.HashSet[String], v: String) => s += v
val mergePartitionSets = (p1: mutable.HashSet[String], p2: mutable.HashSet[String]) => p1 ++= p2
val uniqueByKey = kv.aggregateByKey(initialSet)(addToSet, mergePartitionSets)

但是当我改为Dataset时,我收到了以下错误,是因为Spark 2.0(我正在使用的版本)不支持Dataset上的aggregateByKey吗?

java.lang.NullPointerException
at org.apache.spark.sql.Dataset.schema(Dataset.scala:393)
at org.apache.spark.sql.Dataset.toDF(Dataset.scala:339)
at org.apache.spark.sql.Dataset.showString(Dataset.scala:239)
at org.apache.spark.sql.Dataset.show(Dataset.scala:526)
at org.apache.spark.sql.Dataset.show(Dataset.scala:486)
at org.apache.spark.sql.Dataset.show(Dataset.scala:495)

以下是代码:

case class Food(name: String,
                price: String,
                e_date: String)    
rdd.aggregateByKey( Seq(Food("", "", "")).toDS )( 
                    (f1,f2) => f1.union(f2), 
                    (f1,f2) => f1.union(f2))
/////////
found f1 = Invalid tree; null:
                    null

为什么会发生这种情况的任何想法,提前谢谢你!

1 个答案:

答案 0 :(得分:2)

是的,我认为aggregateByKey仅适用于rdd 这是文档(它是for python)
http://spark.apache.org/docs/latest/api/python/pyspark.html

删除.toDS并尝试代码。 聚合完成后可能会将其转换为DS(不确定性能是否会更好)。