Google bigquery 重复字段上的BigQuery连接表

Google bigquery 重复字段上的BigQuery连接表,google-bigquery,Google Bigquery,我有一个表,其中id为单列,多个列是嵌套的 一, 更好理解的示例模式: id-String childrenNames-字符串重复 动物名称-字符串重复 另一个表只包含单个列 二, 更好理解的示例模式: childrenName-字符串 动物名称-字符串 我需要知道表2中不在表1中的所有记录 所以childrenName和animalName都需要同时属于一个用户 我可以补充一点,我试图为表2中的每一列分别选择表1中“IN”列表中的值,但如果它返回任何行,也可能意味着这两个值都属于两个或更多不同

我有一个表,其中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中没有更多记录


有人知道如何使用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