gpt4 book ai didi

sql - BigQuery 中交叉联接后的行聚合

转载 作者:行者123 更新时间:2023-12-03 23:10:01 24 4
gpt4 key购买 nike

假设您在 BigQuery 中有下表:

A = user1 | 0 0 |
user2 | 0 3 |
user3 | 4 0 |

交叉连接后,您有

dist = |user1  user2  0 0 , 0 3 |  #comma is just showing user val seperation
|user1 user3 0 0 , 4 0 |
|user2 user3 0 3 , 4 0 |

如何在 BigQuery 中执行行聚合来计算跨行的成对聚合。作为典型的用例,您可以计算两个用户之间的欧几里德距离。我想计算两个用户之间的以下指标:

sum(min(user1_row[i], user2_row[i]) / abs(user1_row[i] - user2_row[i]))

对每对用户的所有 i 求和。

例如,在 Python 中,您只需:

for i in np.arange(row_length/2)]):
dist.append([user1, user2, np.sum(min(r1[i], r2[i]) / abs(r1[i] - r2[i]))])

最佳答案

从丑陋的方式开始:您可以将数学压平到查询中。也就是转 for i in ... sum(min(...)/abs(...))进入对每个字段进行操作的 SQL。请注意MINSUM是您不想使用的聚合函数。而是使用+对于 SUM 和 IF(a < b, a, b)对于 MINABS(a, b)看起来像 IF(a < b, b-a, a-b) 。如果您只是计算欧几里得距离,您可以这样做

SELECT left.user, right.user, 
SQRT((left.x-right.x)*(left.x-right.x)
+ (left.y-right.y)*(left.y-right.y)
+ (left.z-right.z)*(left.z-right.z)) as dist
FROM (
SELECT *
FROM dataset.table1 AS left
CROSS JOIN dataset.table1 AS right)

更好的方法是用户定义函数,并将向量创建为重复值。然后你可以写一个 DISTANCE()对交叉连接左侧和右侧的两个数组执行计算的函数。如果您尚未加入 UDF 测试版计划并想加入,请联系 Google 云支持。

最后,如果您将架构从 {user:string, field1:float, field2:float, field3:float,...} 更改为至{user:string, fields:[field:float]}

然后,您可以用位置展平该字段并对其进行交叉连接。如:

SELECT
user,
field,
index,
FROM (FLATTEN((
SELECT
user,
fields.field as field,
POSITION(fields.field) as index,
from [dataset1.table1]
), fields))

如果将其另存为 View ,请将其命名为“dataset1.flat_view”

然后您就可以加入:

SELECT left.user as user1, right.user as user2,
left.field as l, right.field as r,
FROM dataset1.flat_view left
JOIN dataset1.flat_view right
ON left.index = right.index
WHERE left.user != right.user

这将为每对用户和每个字段匹配字段提供一行。您可以将其保存为 View “dataset1.joined_view”。

最后,您可以进行聚合:

既然你想要这个:

sum(min(user1_row[i], user2_row[i]) / abs(user1_row[i] - user2_row[i]))

它看起来像:

SELECT user1, user2, 
SUM((if (l < r, l, r)) / (if (l > r, l-r, r-l))
FROM [dataset1.joined_view]
GROUP EACH BY user1, user2

关于sql - BigQuery 中交叉联接后的行聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29565007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com