如何在 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    

如果应用于您问题中的示例数据 - 输出为