spark会不会将一个groupby阶段拆分成将每个group逐个加载到内存中以减少内存使用?

问题描述 投票:0回答:1

我有一张桌子,里面有 pk

date
user_id

df = (
    spark.read.format("jdbc")
    .option("driver", driver)
    .option("url", url)
    .option("dbtable", table)
    .option("user", user)
    .option("password", password)
    .load()
)

df_ret = df.groupby(df.user_id, df.date).agg({"value": "sum"}).sort("date")

df_ret.take(10)

我发现这需要很长时间,就像spark将整个表加载到内存中一样。

如何让spark一项一项或者至少一打一打地完成工作?

apache-spark pyspark
1个回答
0
投票

现在您对整个表进行加载并进行分组,这意味着它必须遍历所有数据,因此加载所有数据。您可以删除

dbtable
选项并添加以下内容以在原始数据库上运行查询:

.option("query", f"SELECT TOP 10 * FROM {table}")

在这种情况下,您的数据库应该运行查询而不是 Spark。请注意,这仅选择前 10 个,并且尚未执行任何分组。如果你需要完整的groupby,你可以在查询中进行groupby,但这取决于你的引擎的能力是否可行。

© www.soinside.com 2019 - 2024. All rights reserved.