google-bigquery - 在 BigQuery 中使用多个嵌套字段

标签 google-bigquery

我有一些记录,其中包含有关商店的信息。这些记录有几个不同的嵌套字段。嵌套字段之一是标签,另一个是员工。我正在尝试计算具有标签和具有特定姓名的员工的商店数量。所以我这样做了:

SELECT count(*)
FROM [stores.stores_844_1]
where tags.tag_name='foo'
and employees.first_name='bar'

然后我收到错误:

错误:无法查询重复字段tags.tag_name和employees.first_name的叉积

我可以通过将查询更改为来使其工作:

SELECT count(*)
FROM ((flatten([stores.stores_844_1],tags))
where tags.tag_name='foo'
and employees.first_name='bar'

问题是我正在动态创建 where 子句,因此我的 from 子句必须根据 where 中的内容进行更改。虽然我可以在代码中生成一些逻辑来弄清楚 from 子句应该是什么,但我想知道是否有一种方法可以执行以下操作:

SELECT count(*)
FROM [stores.stores_844_1]
where tags.tag_name='foo' WITHIN RECORD
and employees.first_name='bar' WITHIN RECORD

那不必展平主表吗? 我尝试过使用像这样的丑陋的解决方法:

SELECT count(*)
FROM
(SELECT GROUP_CONCAT(CONCAT('>', tags.tag_name,'<')) WITHIN RECORD as f1, GROUP_CONCAT(CONCAT('>',employees.first_name,'<')) WITHIN RECORD as f2
FROM [stores.stores_844_1]
)
where f1 CONTAINS '>foo<'
and f2 CONTAINS '>bar<'

这个丑陋的解决方法按照我想要的方式工作,但它看起来确实很老套和丑陋,一定有更好的方法,对吧?

最佳答案

您可以使用WITHIN RECORD来提出另一个字段来指示值是否存在。我不确定这是否满足您的要求,因为您仍然需要更改 FROM 子句,但它看起来比您当前正在做的更干净。换句话说,试试这个:

SELECT count(*) FROM (
    SELECT SUM(IF(tags.tag_name='foo', 1, 0)) WITHIN RECORD as has_foo,
           SUM(IF(employees.first_name='bar', 1, 0)) WITHIN RECORD as has_bar,
    FROM  [stores.stores_844_1])
    WHERE has_foo > 0 AND has_bar > 0

关于google-bigquery - 在 BigQuery 中使用多个嵌套字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14167238/

相关文章:

r - 出错时再次循环

python - 从 dask dataframe 加载大量数据到 bigquery

google-cloud-platform - 带有 'Order Each by' 子句的 Google BigQuery 大表(105M 记录)产生 "Resources Exceeds Query Execution"错误

google-bigquery - BigQuery Reddit 数据集 : Collecting Comments from Subreddits?

python - 使用 ValueProvider 在 Dataflow 中格式化 BigQuery

google-bigquery - 同时加载到单个 BigQuery 表中

googleapi : Error 400: Dataset myProject:myDataset is still in use, resourceInUse

pyspark - GCP Dataproc Spark 消耗 BigQuery

google-bigquery - 为嵌套表创建架构 - bigquery

json - 通过 jq 使一个(子)JSON 对象出现在一行上