PySpark 中将 DataFrame“展平”为每组 1 行的最有效方法

机智

我有一种情况,我有一个非常大的数据框,其中包含每个时间戳 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 中,您需要groupByDataFrame API 调用。在这种情况下,类似的东西dfAirplaneData.groupBy('utc_time').agg(collect_list(struct(col('plane_num'),col('lat'),col('lon'),col('height'))))将为您提供每个时间戳的结构数组,然后您可以对其执行计算。我理解你对吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在pyspark中将值随机更改为空值的最有效方法是什么?

在 SSRS 报告中将多个 SQL 行显示为带有子行的单行的最有效方法?

Excel VBA中将日期分类为星期的最有效,最简单的方法

在文件中更改1行的最有效方法

为多数组实现numpy.in1d的最有效方法

将n个连续位设置为1的最有效方法?

为每组行按行迭代的最有效方法是什么?

numpy - 为二维数组中的每对行计算 f(v1,v2) 的最有效方法

将数组展平为 1 行

在 SQL Server 中将表行展平为列

如何在PostgreSQL中将行展平为列

在data.frame中将行名称的所有组合对创建为行的有效方法

在pyspark数据框中将非空值填充为1

将行附加到具有不相等列的 Dataframe 的最有效方法

从3列更新1列的最有效方法

在Java中将CLOB读取为String并将String读取为CLOB的最有效解决方案?

对于稀疏的科学矩阵,将行设置为零的最有效方法是什么?

根据熊猫中的条件删除 DataFrame 行的最有效方法是什么?

展平对象值的最佳/最有效方法是什么?

在另一个字段中为1时将位设置为0的最有效方法

如何在 CosmosDB 查询中将一组值展平为行?

如何在postgres中将多个行值展平为串联的字符串?

如何在BigQuery中将嵌套数组数据展平为行

确定列表是否为空的最有效方法

为多个ssh隧道设置最有效的方法?

筛选DataFrame的最有效方法是什么

在 Python 中搜索 DataFrame 的最有效方法

在MATLAB中将数字的最低有效位加1

如何在 Pyspark 中将数据框的 Float 类型列分隔为不超过 1 个小数?