【发布时间】:2020-12-16 01:41:09
【问题描述】:
我们有一个非常大的 Pyspark Dataframe,我们需要对其执行 groupBy 操作。
我们已经尝试过
df_gp=df.groupBy('some_column').count()
而且它需要很长时间(它已经运行了超过 17 小时没有结果)。
我也试过
df_gp=df.groupBy('some_column').agg(count)
但据我所知,行为是相同的。
更多上下文:
- 我们正在使用 %spark2.pyspark 解释器在 Zeppelin(版本 0.8.0)上运行此操作
- Zeppelin 正在 Yarn 客户端上运行
- 数据存储在 Hive (Hive 3.1.0.3.1.0.0-78)
- 初始数据帧是通过使用 llap 查询 Hive 创建的:
from pyspark_llap import HiveWarehouseSession
hive = HiveWarehouseSession.session(spark).build()
req=""" SELECT *
FROM table
where isodate='2020-07-27'
"""
df = hive.executeQuery(req)
- 数据框大小约为 6000 万行,9 列
- 在同一环境中对同一 Dataframe 执行的其他操作,例如
count()或cache()可在一分钟内完成
我一直在阅读有关 Spark 的 groupBy 在不同来源上的信息,但从我收集到的 here 中,Dataframe API 不需要加载或随机播放内存中的键,因此即使在大型内存中也不应该成为问题数据框。
我知道在如此大量的数据上使用groupBy 可能需要一些时间,但这确实太多了。我猜可能有一些内存参数需要调整,或者我们执行 groupBy 操作的方式可能有问题?
[编辑] 我忘了提到在 groupBy 之前在 Dataframe 上处理了一些 UDF。我试过了:
-
groupBy在没有 UDF 的大型 Dataframe 上:不到一分钟就给出结果 -
groupBy在已处理数据帧的样本上:与以前相同的问题
所以我们认为 UDF 是问题的真正原因,而不是 groupBy
【问题讨论】:
标签: dataframe apache-spark pyspark apache-zeppelin