Java Spark:以行列表的形式获取groupBy输出
在spark中使用group by时,是否可以获取Java Spark:以行列表的形式获取groupBy输出,java,apache-spark,spark-streaming,spark-structured-streaming,Java,Apache Spark,Spark Streaming,Spark Structured Streaming,在spark中使用group by时,是否可以获取Dataset 作为输出。这里的行是原始行 Dataset<<List<Row>> output = dataset.groupBy("key"); 请告知是否有方法在不使用POJO的情况下将输出作为Dataset。(例如,基于pojo的解决方案:FlatMapGroupsWIthStateFunction)我为您准备了一个解决方案的开头。您可以使用单调递增\u id创建索引并“记住”数据帧的顺序。然后,您可以按键
Dataset
作为输出。这里的行是原始行
Dataset<<List<Row>> output = dataset.groupBy("key");
请告知是否有方法在不使用POJO的情况下将输出作为
Dataset
。(例如,基于pojo的解决方案:FlatMapGroupsWIthStateFunction
)我为您准备了一个解决方案的开头。您可以使用单调递增\u id
创建索引并“记住”数据帧的顺序。然后,您可以按键分组,使用collect_list
聚合结果,按索引对列表排序,最后将其删除
SparkSQL中存在一个排序数组的sort_array
函数。不幸的是,我不知道在sparkSQL数组上有任何等价的map
函数来删除索引。这就是我提出基于UDF的解决方案的原因:
//按索引“i”排序并保留值的UDF
val sort_和_strip=udf{(x:WrappedArray[Row])=>
x、 sortBy(u.getAs[Long](“i”))
.map(u.getAs[Long](“value”))
}
//使用示例:
火花点火范围(7)
.选择('id%3作为“键”,id作为“值”)
.带列(“i”,单调递增)
.groupBy(“关键”)
.agg(收集列表(结构('i,'值))作为“列表”)
.withColumn(“列表”、sort_和_strip(“列表))
.show(假)
+---+---------+
|键|列表|
+---+---------+
|0 |[0, 3, 6]|
|1 |[1, 4] |
|2 |[2, 5] |
+---+---------+
我有一个解决方案的开始。您可以使用单调递增\u id
创建索引并“记住”数据帧的顺序。然后,您可以按键分组,使用collect_list
聚合结果,按索引对列表排序,最后将其删除
SparkSQL中存在一个排序数组的sort_array
函数。不幸的是,我不知道在sparkSQL数组上有任何等价的map
函数来删除索引。这就是我提出基于UDF的解决方案的原因:
//按索引“i”排序并保留值的UDF
val sort_和_strip=udf{(x:WrappedArray[Row])=>
x、 sortBy(u.getAs[Long](“i”))
.map(u.getAs[Long](“value”))
}
//使用示例:
火花点火范围(7)
.选择('id%3作为“键”,id作为“值”)
.带列(“i”,单调递增)
.groupBy(“关键”)
.agg(收集列表(结构('i,'值))作为“列表”)
.withColumn(“列表”、sort_和_strip(“列表))
.show(假)
+---+---------+
|键|列表|
+---+---------+
|0 |[0, 3, 6]|
|1 |[1, 4] |
|2 |[2, 5] |
+---+---------+
对于任何分布式大型数据集问题,我甚至可以说“不能保证有序”是正确的。您希望对聚合值应用什么顺序?为什么不使用任何标准函数呢?我甚至可以说,对于任何分布式大型数据集问题,一般来说“不能保证有序”是正确的。您希望对聚合值应用什么顺序?为什么不使用任何标准函数?
+-----+----------------------------+
|item1|set |
+-----+----------------------------+
|1 |[[5,3], [4,1], [3,2], [2,2]]|
|2 |[[4,1], [1,2], [5,2], [3,1]]|
+-----+----------------------------+