假设我正在读取存储在
PATH
中的一个非常(非常)大的表。过滤表格并选择几列以使其与 df2
兼容后,我继续在新创建的列 (df
) 上加入 df2
和 'id'
。这个连接非常昂贵,所以我想打破逻辑计划,因为我随后在 groupBy
语句中进行了大量聚合(这也是一个非常昂贵的阶段)。
在将两个表连接在一起后检查查询以打破逻辑计划的正确方法是什么?
选项 1:中查询
df = (
spark.read.parquet(PATH)
.where(FILTERS)
.select(COLUMNS)
.join(
other=df2,
on='id',
how='inner'
)
.checkpoint()
.groupBy('id')
.agg(AGGREGATES)
)
选项 2:单独查询
df = (
spark.read.parquet(PATH)
.where(FILTERS)
.select(COLUMNS)
.join(
other=df2,
on='id',
how='inner'
)
.checkpoint()
)
# Resume in separate query
df = (
df
.groupBy('id')
.agg(AGGREGATES)
)
两者是等价的。在这两个选项中,您的
groupBy
都在检查点数据帧上运行。您只需根据哪个更具可读性来选择一个。第二个选项更灵活,因为您还可以使用检查点数据框执行其他操作。喜欢
# Resume in separate query
grouped1 = (
df
.groupBy('id')
.agg(AGGREGATES)
)
grouped2 = (
df
.groupBy('id2')
.agg(AGGREGATES)
)