BigQuery 中交叉联接后的行聚合

2023-12-23

假设您在 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。注意MIN and SUM是您不想使用的聚合函数。而是使用+对于总和和IF(a < b, a, b) for MIN. ABS(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,...} to {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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BigQuery 中交叉联接后的行聚合 的相关文章

随机推荐

  • Spring-Batch 复合编写器如何跳过异常

    我正在使用 Spring Batch 我的步骤配置如下 Bean public Step testStep JdbcCursorItemReader
  • Azure 模拟器卡住

    我正在从事 azure WorkerRole 项目VS2015 SDK 2 9 该角色在云中运行良好 但是当我尝试使用 FullEmulator 在本地运行它时 角色无法启动 面料 角色实例 部署29 116 MyComp Engine D
  • PresentModalViewController 使我的应用程序崩溃

    我知道 这是最简单的事情之一 但几天来我一直在努力反对这一点 我过去已经做过很多次了 但由于某种原因 尝试呈现模式视图控制器只会使应用程序崩溃到黑屏 控制台中没有报告任何内容 我希望有人可能遇到过这个问题并提供一些建议 此代码是从 UIVi
  • 如何使用 angular.foreach 比较两个 JavaScript 数组

    我有两个 javascript 对象 var obj1 key1 value1 key2 value2 And var obj2 key1 value1 key2 someOtherValue 正如您所看到的 两个对象之间存在一个差异key
  • 用于在字段级别区分 CSV 文件并将结果输出到 CSV 并保持颜色的工具

    我正在尝试比较 2 个 csv 文件在字段级别的差异 并用颜色编码差异 我尝试了这个命令 git diff color words space x csv y csv 但有两个问题 它将彼此不同的单元格数据放在一起 我不想要这样 我只需要在
  • 创建新工作区

    Modeshape 文档的第 7 1 6 节说 您的应用程序现在可以使用标准 JCR 2 0 API 创建和删除工作区 JCR 2 0 文档说使用 Workspace createWorkspace String name 如何使用本文底部
  • addClass(“test”)给出错误:TypeError:未定义不是函数

    在控制台中我有 myCssClass 0 parentNode li span class myCssClass some text span li 我想为父级添加 css 类span 对于标签 li 我尝试这样 myCssClass 0
  • Android:如何根据设备时区获取默认日期格式

    有没有简单的方法可以根据用户的时区获取默认日期格式 The SimpleDateFormat 给出根据用户区域设置的日期格式 我正在寻找一种场景 需要将提供的日期转换为基于时区的日期格式 例如 用户将其区域设置设置为 中文 并且采用德国时区
  • Java 最小化依赖关系

    我遇到过这样的情况 一小段Java代码有大量依赖的jar 然而 这些 jar 内部的依赖关系非常浅 在大多数情况下 它仅依赖于单个接口的 jar 我不想将所有 jar 与应用程序一起分发 而是只想将特定的类文件分发到它实际使用的 jar 中
  • 记录 JUnit 测试运行所需的时间

    我想记录我的 JUnit 测试以编程方式运行需要多长时间 我在各种测试类中有大量测试 我想了解每个单独的测试方法运行需要多长时间 我可以更改继承结构或以不同方式注释方法 但我希望避免在测试方法本身以及用于设置测试业务逻辑的之前 之后方法中添
  • Git 说是最新的,尽管更改是远程进行的

    使用 git bash 我在我的主分支上工作 推送它并决定我想要实现一个新功能 我为此创建了一个新分支 后来我添加了另一个功能 创建了另一个分支 我测试了所有内容并且它正常工作 所以我决定将所有内容合并到我的主分支 我将两个新分支推送到远程
  • 如何将.plist文件中的数据结构读取到NSArray中

    我正在使用以下内容手动创建数据结构 NSDictionary league1 NSDictionary alloc initWithObjectsAndKeys Barclays Premier League name Premier Le
  • 如何从路径中删除 Microsoft.PowerShell.Core\FileSystem::\\

    我正在使用 powershell 与文件夹及其所有子文件夹进行比较 并且它在我的本地计算机上工作正常 但是当我在服务器上尝试它时 它给了我错误并附加 Microsoft PowerShell Core FileSystem 到所有文件 如果
  • 如何使用 PHP 将元素添加到 JSON 对象? [复制]

    这个问题在这里已经有答案了 我有这个 JSON 数组 我想使用 PHP 向其中添加另一个值 使用 PHP 将 ID 和名称添加到该数组的最简单方法是什么 id 1 name Charlie id 2 name Brown id 3 name
  • 获取node.js应用程序的最大堆大小

    现在我在paas平台上使用node js 并且容器有内存限制 现在我想获取node js应用程序的堆大小的最大值 我知道使用参数 max old space size 我可以设置最大堆大小 但我想知道如何获取 max old space s
  • Selenium Webdriver sendkeys 在 IE9.0 中不触发 onchange 事件

    我正在使用 Java 为 ExtJs 中构建的应用程序编写 Selenium 测试脚本 我在附加到 onchange 事件的页面之一中有一个输入字段 每当用户修改字段中的文本时 就会触发 onchange 事件 我正在使用 WebDrive
  • 在 PyDev 控制台中停止正在运行的命令

    我使用 PyDev 控制台运行长脚本 并且经常希望在命令中间停止 在常规 python shell 中 我按 ctrl c 它会通过键盘中断停止命令 但在 PyDev 控制台中 它会进行文本复制 如何停止此控制台中的命令而不终止它 如果您使
  • 何时应使用 Readonly 和 Get only 属性

    在 NET 应用程序中 何时应使用 ReadOnly 属性 何时应仅使用 Get 这两者有什么区别呢 private readonly double Fuel 0 public double FuelConsumption get retu
  • @TargetApi 注解仅适用于一个 Api 级别或更高级别吗?

    我在我的应用程序中使用 TargetApi 23 TargetApi 23 Override public void onAttach Context context super onAttach context onAttachToCon
  • BigQuery 中交叉联接后的行聚合

    假设您在 BigQuery 中有下表 A user1 0 0 user2 0 3 user3 4 0 交叉连接后 您有 dist user1 user2 0 0 0 3 comma is just showing user val sepe