我有一种情况,我有一个非常大的数据框,其中包含每个时间戳 5 行的飞机位置数据(请参阅下表以获取 1 个时间戳的示例......其中 3 行只有点,但想象它们有 plane_nums 和位置)
+---------------------------+-----------+-----------+-----------+-----------+
| utc_time | plane_num | lat | lon | height |
+---------------------------+-----------+-----------+-----------+-----------+
| 2021-06-02T05:01:40+00:00 | 1| 51.759014 | -1.256688 | 47.337597 |
| 2021-06-02T05:01:40+00:00 | 2| 41.758014 | 1.346678 | 41.632522 |
| ... | ... | ... | ... | ... |
| ... | ... | ... | ... | ... |
| ... | ... | ... | ... | ... |
+---------------------------+-----------+-----------+-----------+-----------+
对于每个时间戳,我想将此数据框折叠到 1 行,其中对一组 2 个平面之间的各种距离进行了各种计算,并将它们的所有纬度/经度放在一行中。
我知道我可以通过将数据帧过滤到每个平面(每个时间戳总是有一个平面 1、2、3、4、5)来轻松地在 pyspark 中完成此操作。请参阅下面的代码,它为 1 个时间戳创建了一个数据帧,但想象一下有数百万个时间戳。
dfAirplaneData.filter = spark.createDataFrame([
(2021-06-02T05:01:40+00:00, 1, 51.759014, -1.256688, 47.337597),
(2021-06-02T05:01:40+00:00, 2, 41.758014, 1.346678, 41.632522),
(2021-06-02T05:01:40+00:00, 3, 41.758014, 1.346678, 11.632522),
(2021-06-02T05:01:40+00:00, 4, 41.758014, 1.346678, 21.632522),
(2021-06-02T05:01:40+00:00, 5, 11.758014, 1.346678, 41.632522)
], ("utc_time", "plane_num", "lat", "lon", "height"))
dfPlane1 = dfAirplaneData.filter(F.col('plane_num')==1))
dfPlane2 = dfAirplaneData.filter(F.col('plane_num')==2))
dfPlane3 = dfAirplaneData.filter(F.col('plane_num')==3))
然后将数据帧多次加入自身以获得一行,但这感觉效率低下。在 pyspark 中是否有更好的方法(可能.groupBy
与时间戳一起使用)?
我知道而不是加入,我可以使用:w = Window.partitionBy(utc_time)
但我每组只需要 1 行,所以我最终会为每一行计算/复制工作,然后过滤到 1 个摘要行。另外,我在进行比较时需要知道哪个plane_num,所以不确定这是否容易实现Window.partitionBy
我已经简要地阅读了Pandas UDF 分组地图,我相信如果这是最好的方法,我可以使用分组地图来遍历Pandas数据框。
对解决此问题的最有效、最简单的方法感兴趣。如果加入同一个数据帧是最好的,那么我可以使用这种方法。
在 Spark 中,您需要groupBy
DataFrame API 调用。在这种情况下,类似的东西dfAirplaneData.groupBy('utc_time').agg(collect_list(struct(col('plane_num'),col('lat'),col('lon'),col('height'))))
将为您提供每个时间戳的结构数组,然后您可以对其执行计算。我理解你对吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句