Google bigquery 重复字段上的BigQuery连接表
我有一个表,其中id为单列,多个列是嵌套的 一, 更好理解的示例模式: id-String childrenNames-字符串重复 动物名称-字符串重复 另一个表只包含单个列 二, 更好理解的示例模式: childrenName-字符串 动物名称-字符串 我需要知道表2中不在表1中的所有记录 所以childrenName和animalName都需要同时属于一个用户 我可以补充一点,我试图为表2中的每一列分别选择表1中“IN”列表中的值,但如果它返回任何行,也可能意味着这两个值都属于两个或更多不同的ID 示例行表1 身份证号码:1234 儿童姓名:['Ana','Frank'] 动物名称:['Rex','Max'] 示例行表2 A 孩子的名字:“安娜” 动物名:“奥兹” B 孩子的名字:“弗兰克” 动物名:“雷克斯” 对于上面的示例,我应该从表2中获取行A,因为“Ozzy”不属于ID1234。让我们假设表1中没有更多记录Google bigquery 重复字段上的BigQuery连接表,google-bigquery,Google Bigquery,我有一个表,其中id为单列,多个列是嵌套的 一, 更好理解的示例模式: id-String childrenNames-字符串重复 动物名称-字符串重复 另一个表只包含单个列 二, 更好理解的示例模式: childrenName-字符串 动物名称-字符串 我需要知道表2中不在表1中的所有记录 所以childrenName和animalName都需要同时属于一个用户 我可以补充一点,我试图为表2中的每一列分别选择表1中“IN”列表中的值,但如果它返回任何行,也可能意味着这两个值都属于两个或更多不同
有人知道如何使用BigQuery SQL标准或遗留版本解决此类问题吗?下面是针对BigQuery标准SQL的
#standardSQL
SELECT childrenName, animalName, ARRAY_AGG(DISTINCT id) users
FROM `project.dataset.table2`
CROSS JOIN `project.dataset.table1`
WHERE (SELECT COUNT(1) FROM UNNEST(childrenNames) cn WHERE cn = childrenName) > 0
AND (SELECT COUNT(1) FROM UNNEST(animalNames) an WHERE an = animalName) > 0
GROUP BY childrenName, animalName
您可以使用数据示例对上述问题进行测试和处理
#standardSQL
WITH `project.dataset.table1` AS (
SELECT '1' id, ['Ana', 'Frank'] childrenNames, ['Rex', 'Max'] animalNames
), `project.dataset.table2` AS (
SELECT 'Ana' childrenName, 'Ozzy' animalName UNION ALL
SELECT 'Frank', 'Rex'
)
SELECT childrenName, animalName, ARRAY_AGG(DISTINCT id) users
FROM `project.dataset.table2`
CROSS JOIN `project.dataset.table1`
WHERE (SELECT COUNT(1) FROM UNNEST(childrenNames) cn WHERE cn = childrenName) > 0
AND (SELECT COUNT(1) FROM UNNEST(animalNames) an WHERE an = animalName) > 0
GROUP BY childrenName, animalName
结果
Row childrenName animalName users
1 Frank Rex 1
注意:输出中的字段用户是一个重复的字符串/数组,由具有搜索对的用户列表组成
上述内容中不太详细的变化将是
#standardSQL
SELECT childrenName, animalName, ARRAY_AGG(DISTINCT id) users
FROM `project.dataset.table2`
CROSS JOIN `project.dataset.table1`
WHERE childrenName IN UNNEST(childrenNames)
AND animalName IN UNNEST(animalNames)
GROUP BY childrenName, animalName
结果完全一样
Row childrenName animalName users
1 Frank Rex 1
所以,很明显,使用第二个:o
。。。表1有5mln记录,表2有200k-因此查询超出了资源限制
试试下面的版本
#standardSQL
WITH flatten_table1 AS (
SELECT id, childrenName, animalName
FROM `project.dataset.table1`,
UNNEST(childrenNames) childrenName,
UNNEST(animalNames) animalName
)
SELECT childrenName, animalName, id
FROM `project.dataset.table2`
JOIN flatten_table1
USING(childrenName, animalName)
你应该提供你的数据的例子!谢谢我刚刚添加了它。第二个查询可能会有任何优化吗?我得到“错误:查询超出了资源限制”。使用了112320.34437458635个CPU秒,当运行应用于我的数据的查询时,此查询必须使用少于46000.0个CPU秒。请从删除数组_aggdinct id开始,因为首先删除该数组中的DISTINCT_agg是额外的,或者可能更好。此错误也是我在删除该片段后得到的。什么错误和片段?另外,让我们了解一下您的真实数据是什么—就数量而言—正如您所提到的问题—让我们假设表1中没有更多的记录—上面提到的错误,因此错误:查询超出了资源限制。使用了112320.34437458635个CPU秒,此查询使用的CPU秒数必须少于46000.0个。对于piece,我指的是上一个查询中的“ARRAY\u-id”。表1有5mln记录,表2有200k