如何有效地展平Spark数据框中的特征?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何有效地展平Spark数据框中的特征?相关的知识,希望对你有一定的参考价值。

我有一个非常大的数据帧(450000行),其中包含传感器数据和时间戳,如下所示:

+--------+-----------+-----------+------------+-----------+
|Time [s]|   Sensor1 |   Sensor2 |    Sensor3 |   Sensor4 | 
+--------+-----------+-----------+------------+-----------+
| 0.00198|-0.55999756|-0.19271851|   1.1320496|   1.373291| 
| 0.00398| -1.2171936|  1.0081482|  0.25726318| 0.61035156| 
| 0.00598|-0.29586792|  1.4437866|  -1.1341858|   1.373291| 
| 0.00798|  1.4489746| 0.39047241|  -1.4620972|-0.30517578| 
| 0.00998|  1.5341187| -1.1869812| -0.19256592|-0.15258789| 
| 0.01198| 0.04196167| -1.2620544|   1.1372375| 0.45776367| 
| 0.01398| -1.0899353| 0.19500732|  0.79772949|  1.8310547| 
| 0.01598| -0.6300354| 0.77346802| -0.69030762| 0.61035156| 
| 0.01798| 0.95153809| 0.40786743| -0.96694946|        0.0| 
| 0.01998|  1.5705872|-0.75668335| 0.063323975| 0.91552734|
| 0.02198| 0.29678345| -1.4421082|   1.1439514| -1.0681152|
| 0.02398| -1.3595581|-0.25726318|   1.4170837| 0.45776367|
+--------+-----------+-----------+------------+-----------+

我需要在一个时间窗口内展平该数据并追加到列表中。

例如,如果窗口为10ms,那么我将从上方获取5个传感器数据并添加到列表中,如下所示:

[[-0.55999756, -0.19271851, 1.1320496, 1.373291, -1.2171936, 1.0081482, 0.25726318, 0.61035156, -0.29586792, 1.4437866, -1.1341858, 1.373291, 1.4489746, 0.39047241, -1.4620972, -0.30517578, 1.5341187, -1.1869812, -0.19256592, -0.15258789]
... ]

我目前正在通过以下代码实现这一目标:

mylist=[]
df= df.withColumn("row", row_number().over(Window.orderBy(monotonically_increasing_id())))
for m in range(n+1, df.count()+n+1, n):
  newdf= df.filter((col("row")>(m-n)) & (col("row")<m))
  flatlist= newdf.select("Sensor1", "Sensor2", "Sensor3", "Sensor4").rdd.flatMap(lambda x: x).collect()
  mylist.append(flatlist)

其中m和n是窗口的边界。

这可以工作,但是对于大窗口和大数据帧,它要花很多时间(也许是因为collect()?)。 是否有更有效的方法来获得相同的结果?

使用Pandas,我可以执行以下操作,但是效率更高吗? (我宁愿使用Spark进行并行处理)

pandasdf = df.toPandas()
flatlist=[pandasdf.values.flatten().tolist()]
答案

tl; dr使用groupBy运算符(也许使用window标准功能),然后使用collect_list标准功能。

您可能想使用用户定义的函数(UDF)从collect_list中仅取出前5个元素。

我没有使用Python / pyspark,所以可以提供更多帮助。

以上是关于如何有效地展平Spark数据框中的特征?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark 中有效地选择包含某个值的数据框列?

如何有效地展平 NSOutlineView?

如何有效地将 PySpark 数据框中的行相乘?

如何修改 Spark 数据框中的 numpy 数组?

如何根据记录中其他 4 个字段的布尔运算符有效地更新数据框中的字段?

如何使用 Pandas 或 Spark Dataframe 展平嵌套的 Excel 数据?