我想重写一些用RDD编写的代码来使用DataFrames。在我找到这个之前,它工作得非常顺利:
events
.keyBy(row => (row.getServiceId + row.getClientCreateTimestamp + row.getClientId, row) )
.reduceByKey((e1, e2) => if(e1.getClientSendTimestamp <= e2.getClientSendTimestamp) e1 else e2)
.values
从
开始很简单 events
.groupBy(events("service_id"), events("client_create_timestamp"), events("client_id"))
但下一步是什么?如果我想迭代当前组中的每个元素怎么办?它甚至可能吗? 提前致谢。
答案 0 :(得分:4)
GroupedData
无法直接使用。数据没有物理分组,只是一个逻辑操作。您必须应用agg
方法的某些变体,例如:
events
.groupBy($"service_id", $"client_create_timestamp", $"client_id")
.min("client_send_timestamp")
或
events
.groupBy($"service_id", $"client_create_timestamp", $"client_id")
.agg(min($"client_send_timestamp"))
其中client_send_timestamp
是您要汇总的列。
如果您想保留信息而不是汇总join
或使用窗口功能 - 请参阅Find maximum row per group in Spark DataFrame
Spark还支持用户定义的聚合函数 - 请参阅How to define and use a User-Defined Aggregate Function in Spark SQL?
Spark 2.0 +
您可以使用Dataset.groupByKey
将组公开为迭代器。