Google analytics 使用“展平”选择其中var1(非重复)=;abc";从包含多个嵌套变量的bigquery表?

Google analytics 使用“展平”选择其中var1(非重复)=;abc";从包含多个嵌套变量的bigquery表?,google-analytics,nested,google-bigquery,flatten,Google Analytics,Nested,Google Bigquery,Flatten,我对BigQuery相当陌生(使用它的第三天没有任何培训),我只是想了解嵌套字段等 我查看了以下参考资料,并使用了google bigquery文档链接上的personsdata示例 我想运行以下查询: select * from [dataset.tableid] where fullname = 'John Doe' 如果运行此操作,将出现以下错误: 错误:无法同时输出多个独立重复的字段。发现儿童和城市居住的地方 通过阅读上述文章,这是不可能的,因为你需要将结果展平,从我的理解来看,这

我对BigQuery相当陌生(使用它的第三天没有任何培训),我只是想了解嵌套字段等

我查看了以下参考资料,并使用了google bigquery文档链接上的personsdata示例

我想运行以下查询:

select *
from [dataset.tableid]
where fullname = 'John Doe'
如果运行此操作,将出现以下错误:

错误:无法同时输出多个独立重复的字段。发现儿童和城市居住的地方

通过阅读上述文章,这是不可能的,因为你需要将结果展平,从我的理解来看,这只是复制了所有不重复的变量

全名|年龄|性别| Children.name | Children.age

约翰·多伊22 |男约翰| 5

约翰·多伊| 22 |男简| 7

上面的一篇文章建议您仍然可以使用bigquery中的flatte函数来使用where语句:

select fullname,
age,
gender,
citiesLived.place
FROM (FLATTEN([dataset.tableId], children))
WHERE
(citiesLived.yearLived > 1995) AND
(children.age > 3)
GROUP BY fullName, age, gender, citiesLived.place
如果我将此更改为:

select *
FROM (FLATTEN([dataset.tableId], children))
WHERE fullname = 'John Doe'
这很好,如果我改成这样,我会得到我所需要的:

select *
FROM (FLATTEN([dataset.tableId], citieslived))
WHERE fullname = 'John Doe'
然后我得到以下错误:

错误:无法同时输出多个独立重复的字段。发现孩子和城市都活了一年

有人能解释为什么这会基于“Children”而不是“citieslive”进行展平,以及如何知道在具有多个嵌套变量的更复杂数据集的展平中使用哪些变量

先谢谢你

有人能解释为什么基于“儿童”而非“城市生活”的扁平化会奏效吗

再次检查此表的架构

                Schema                
  ----------------------------------- 
   |- kind: STRING                    
   |- fullName: STRING (required)
   |- age: INTEGER
   |- gender: STRING
   +- phoneNumber: RECORD
   |  |- areaCode: INTEGER
   |  |- number: INTEGER
   +- children: RECORD (repeated)
   |  |- name: STRING
   |  |- gender: STRING
   |  |- age: INTEGER
   +- citiesLived: RECORD (repeated)
   |  |- place: STRING
   |  +- yearsLived: INTEGER (repeated)
正如您所看到的,当您展平
子项
重复记录时,唯一留给输出的重复记录是
CitiesLive
,即使它内部还有另一个重复字段YearsSlived,它们是非独立的,因此BigQuery遗留SQL可以输出结果

现在,当你通过
citieslive
进行扁平化时,你得到的结果是两个重复的文件-
子文件和
年文件。这两个是独立的,因此BigQuery遗留SQL无法输出这样的结果

如何知道在具有多个嵌套变量的更复杂数据集的flatten中使用哪些变量

要使其工作-您应该添加另一个扁平化(例如)
yearsLived
字段。像下面这样

FROM (FLATTEN(FLATTEN([dataset.tableId], citieslived), yearsLived))  
添加所有这些多个扁平化可能会变得很麻烦,因此使用BigQuery标准SQL确实是一个不错的选择

如果运行此查询,请参见

SELECT
*
FROM
(FLATTEN((FLATTEN(([project_id:dataset_id.table]), citiesLived.yearsLived)), citiesLived))
它会像预期的那样变平

使用传统SQL时,BQ会尝试为您更改结果

但我注意到,如果您试图展平包含其他重复字段的重复字段,那么有时您可能会遇到这些错误(请注意,
citieslive
citieslive.yearsLived
字段都是重复的)

因此,解决这个问题的一种方法是,对所有要处理的重复字段强制执行展平操作(在我向您展示的示例中,我首先展平了yearsLived,然后是citiesLived),而不是依赖于传统SQL提供的自动展平操作


但我强烈建议并鼓励您学习Elliot在评论中建议的BQ标准SQL版本。一开始,它的学习曲线可能会更陡峭,但从长远来看,它将完全获得回报(而且您不会像我们公司那样,最终不得不将所有遗留查询迁移到标准查询)

有理由尝试使用遗留SQL执行此操作吗?我建议改用标准SQL,因为它使基于数组的转换更容易表达。嗨,Elliott,谢谢你的快速响应,对不起,我甚至不知道bigquery有两种SQL方言。让我看看这一点,看看迁移以及为什么我们使用遗留语言。如果您对使用标准SQL有任何建议,请告诉我。感谢您的快速回复,米哈伊尔!我说的对吗?如果存在与要展平的字段相关的依赖字段,则必须指定并展平所有这些依赖字段?我不知道bigquery中有两种SQL语言。谢谢你的提示!如果字段是依赖的,那么遗留SQL可以输出重复字段。你需要把那些独立的东西弄平。但是,从这里开始,最好的方法仍然是使用BigQuery标准SQL。它有更好的处理记录的方法。看一看数组就有了一个想法-谢谢你,Mikhail,我刚刚尝试使用标准SQL从我们的一个live bigquery数据集中进行选择,但是我得到了以下错误:错误:语法错误:意外的浮点文字“8286363.”在[2:6]。我不确定您是否能够解释这个错误,但我猜这是因为我们将数据集命名为“8286363”,bigquery只能处理以字符开头的数据集?您应该发布新问题,并说明您的具体问题,这样我们就能够回答它了。评论不允许有效地回答,也不是真正的操作方式。它更多的是一个问答网站,而不是一个讨论论坛。所以发布新问题。同时,选择一个答案,如果它回答了你当前的问题,就接受它。希望这对您有意义:o)同时-我认为您的猜测是正确的-您可以在这里查看更多谢谢您的建议,威尔,我不知道SQL在bigquery中有两种方言。我将进一步研究迁移到标准SQL。