我有一张桌子,里面有 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一项一项或者至少一打一打地完成工作?
现在您对整个表进行加载并进行分组,这意味着它必须遍历所有数据,因此加载所有数据。您可以删除
dbtable
选项并添加以下内容以在原始数据库上运行查询:
.option("query", f"SELECT TOP 10 * FROM {table}")
在这种情况下,您的数据库应该运行查询而不是 Spark。请注意,这仅选择前 10 个,并且尚未执行任何分组。如果你需要完整的groupby,你可以在查询中进行groupby,但这取决于你的引擎的能力是否可行。