如何在 BigQuery 中优化这种交叉连接?
How to optimize this cross join in BigQuery?
我正在努力为相当复杂的查询争取尽可能好的 elapsed/slot 时间。
交叉连接部分接受一个 table,它有一个 hhID、一个 brandID 和 2 个其他值(v1 和 v2,为了这个例子)。
我必须将每个 brandID 的 v1 和 v2 与每个 hhID 内的每个其他 brandID(包括它自己)相关联。
因此,例如,如果我有以下行:
hhid brandID v1 v2
1 A 4 7
1 B 6 3
2 A 2 7
2 B 9 5
.
.
.
我希望输出类似于:
hhid brand1 brand2 (brand1.v1 + brand2.v2)
1 A A 4 + 7 = 11
1 A B 4 + 3 = 7
1 B A 6 + 7 = 13
1 B B 6 + 3 = 9
2 A A 2 + 7 = 9
2 A B 2 + 5 = 7
2 B A 9 + 7 = 16
2 B B 9 + 5 = 14
.
.
.
输入 table 可能非常大(数十万行),这自然会导致更大的输出 table(超过一百万行)。
目前,我只是自己加入 hhID 上的 table。我研究了 window 函数,但我没有看到在这里应用它们的方法。我也尝试过使用 UDF,以尝试缓存此 table 并允许更快的计算,但结果基本上是相同的。
到目前为止,这是我的查询中最慢的部分。我应该如何优化它?
试试下面
select hhid,
t.brandid as brand1,
brand.brandID as brand2,
v1 + brand.v2 as total
from (
select *,
array_agg(struct(brandID, v2)) over(partition by hhid) brands
from your_table
) t, unnest(brands) as brand
如果应用于您问题中的示例数据 - 输出为
我正在努力为相当复杂的查询争取尽可能好的 elapsed/slot 时间。
交叉连接部分接受一个 table,它有一个 hhID、一个 brandID 和 2 个其他值(v1 和 v2,为了这个例子)。
我必须将每个 brandID 的 v1 和 v2 与每个 hhID 内的每个其他 brandID(包括它自己)相关联。
因此,例如,如果我有以下行:
hhid brandID v1 v2
1 A 4 7
1 B 6 3
2 A 2 7
2 B 9 5
.
.
.
我希望输出类似于:
hhid brand1 brand2 (brand1.v1 + brand2.v2)
1 A A 4 + 7 = 11
1 A B 4 + 3 = 7
1 B A 6 + 7 = 13
1 B B 6 + 3 = 9
2 A A 2 + 7 = 9
2 A B 2 + 5 = 7
2 B A 9 + 7 = 16
2 B B 9 + 5 = 14
.
.
.
输入 table 可能非常大(数十万行),这自然会导致更大的输出 table(超过一百万行)。
目前,我只是自己加入 hhID 上的 table。我研究了 window 函数,但我没有看到在这里应用它们的方法。我也尝试过使用 UDF,以尝试缓存此 table 并允许更快的计算,但结果基本上是相同的。
到目前为止,这是我的查询中最慢的部分。我应该如何优化它?
试试下面
select hhid,
t.brandid as brand1,
brand.brandID as brand2,
v1 + brand.v2 as total
from (
select *,
array_agg(struct(brandID, v2)) over(partition by hhid) brands
from your_table
) t, unnest(brands) as brand
如果应用于您问题中的示例数据 - 输出为