当前位置: 首页 > 面试题库 >

BigQuery中交叉联接后的行聚合

颜文昌
2023-03-14
问题内容

假设您在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
Beta计划中,但不想加入,请联系google cloud支持。

最后,如果您将架构从更改{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))

如果将其另存为视图,则将其命名为“ 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

这将为您每对用户和每个字段匹配字段各提供一行。您可以将其另存为视图“ 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


 类似资料:
  • 问题内容: 我一直在尝试查找有关我的查询的问题。该查询实际上是由HQL的hibernate生成的,但是生成的SQL并没有达到我的期望。稍微修改SQL会产生正确的结果,但是我不确定为什么修改会有所不同。 原始查询(不返回任何行) 修改的查询-用逗号替换交叉联接(隐式交叉联接) 返回一行 我的理解可能是错误的,因为写作与Writing相同。所以我不明白为什么查询返回不同的结果。 与导致此问题的第一个查

  • 我希望为结果提供内容过滤。我的(为简洁起见而编辑)实体如下所示: 节点: 场景: 来源: 下面是我希望实现的筛选器的一个示例。 给定一个SourceTypes集合,我希望选择所有场景,这样每个场景都会被其中一个类型的源引用。我使用QueryDSL和以下谓词实现了这一点: 一系列这些谓词被组合起来给出一个整体查询。即使只选择一个SourceType,结果查询看起来也是这样: 我相信上面发生的是交叉连

  • 我尝试在pyspark中(在Spark 1.5.0上)运行以下SQL查询:

  • 根据Hibernate文档https://docs.jboss.org/Hibernate/core/3.5/referen/html/queryhql.html#queryhql-joins-forms 隐式联接应生成为内部联接。 我注意到有一个打开的bug https://hibernate.atlassian.net/browse/hhh-7707可能提到了这个问题,但没有人回答,而且它已经

  • 问题内容: 我正在尝试在BigQuery中加入三个表;表1具有一个事件的记录(即每一行是一个记录),表2具有第二个事件的记录,表3具有类别名称。 我想生成一个最终表,该表具有按类别和设备平台划分的表1和表2的计数。但是,每次运行此命令时,我都会收到一条错误消息,指出 join.t3.category不是join中任何一个表的字段 。 这是我当前的代码: 作为参考,这是表1和2之间的一个更简单的联接

  • 问题内容: 我有一个通用的“ Dimension”和“ DimensionMember”表。 这些表存储大量维和维成员。 我想从可变数量的维中交叉连接维成员。示例:“性别”,“就业类型”,“合同类型”维度中的交叉联接维度成员应产生以下组合 组合的标签应通过连接维度成员的标签来创建(如上所示)。 先感谢您 更新 维度列表(例如“性别”,“就业类型”,“合同类型”)是DYNAMIC(由运行时的另一个查

  • 问题内容: 我正在使用Hibernate 3.6和MSSQL 2012。 执行此HQL时 我正在获取此SQL 请注意 交叉连接 和where子句中的 附加条件* 。 根据Hibernate docs https://docs.jboss.org/hibernate/core/3.5/reference/en/html/queryhql.html#queryhql- joins- forms 隐式连

  • 主要内容:笛卡尔积前面所讲的查询语句都是针对一个表的,但是在关系型数据库中,表与表之间是有联系的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表。 在 MySQL 中,多表查询主要有交叉连接、内连接和外连接。由于篇幅有限,本节主要讲解交叉连接查询。内连接和外连接将在《 MySQL内连接》和《 MySQL外连接》中讲解。 交叉连接(CROSS JOIN)一般用来返回连接表的笛卡尔积。 本节