【发布时间】:2022-01-08 10:01:56
【问题描述】:
总的来说,我对数据帧和 pyspark 完全陌生。
在 python 中,我想做的只是微不足道的 - 但是我似乎找不到使用 pyspark 不需要很长时间的方法。
我有一个大约 4000 行的 pyspark 数据框,其架构如下:
root
|-- waveformData: struct (nullable = true)
| |-- elements: array (nullable = true)
| | |-- element: double (containsNull = true)
| |-- dimensions: array (nullable = true)
| | |-- element: integer (containsNull = true)
每个数组大约有 20000 个双精度数。
搜索此数组以查找最大值和阈值(最大值的 50% 的第一个实例)只需要很少的时间 - 但只有在数据采用“正常”格式时(numpy 数组)。
我使用的是基本款:
wav_df = temp_data.select("waveformData").toPandas()
wav = wav_df.to_numpy()[0][0].get("elements")
然后搜索最大值/阈值
但是 'toPandas' 步骤需要很长时间(比如单行需要 30 秒)
为什么?
我一直在尝试使用 .collect 等对 pyspark 数据帧进行操作以避免这种转换,但我尝试的一切都需要很长时间。
如果 pyspark 是针对大数据的,那我肯定做错了,这不可能是处理这么多数据的正常时间。
我错过了什么?
【问题讨论】:
-
能否也为waveformData添加一些测试数据,这样我就可以使用该测试数据创建一个数据框,看看可以做什么
-
怎么加最好,20000元素的数组贴不上去。
-
我想我发现了这个问题,我一次加载一行并转换为熊猫,如果我一次转换所有 4000 行似乎要快得多,但后来我内存不足:(
-
失败并显示以下错误消息:原因:org.apache.spark.SparkException:作业因阶段失败而中止:1286 个任务 (1025.2 MiB) 的序列化结果的总大小大于 spark。 driver.maxResultSize (1024.0 MiB)
-
我尝试使用:spark.driver.maxResultSize g 但是得到'SparkSession'对象没有属性'驱动程序'