BigQuery中“预览”和查询之间的区别

时间:2016-08-25 08:48:41

标签: google-bigquery

我有以下表格架构:

+-----+---------+----------+
+ chn | INTEGER | NULLABLE |
+-----+---------+----------| 
+ size| STRING  | NULLABLE |
+-----+---------+----------| 
+ char| REPEATED| NULLABLE |
+-----+---------+----------| 
+ ped | INTEGER | NULLABLE |
+-----+---------+----------

当我点击Google BigQuery Web UI中的“预览”时,我得到以下结果:

enter image description here

但是当我查询我的表时,我得到了这个结果:

enter image description here

似乎“预览”将我重复的字段解释为数组,我希望在查询中获得相同的结果以限制行数。

确实尝试取消选中“使用旧版SQL”,这给了我相同的结果,但问题是使用我的表,使用“使用旧版SQL”执行相同的查询大约需要1.0秒检查并且在未经检查的情况下约为12秒。

我在这里寻找速度,所以不幸的是,不使用旧版SQL不是一个选择......

是否有另一种方式来渲染我的重复字段,就像在“预览”中那样?

感谢您的帮助:)

3 个答案:

答案 0 :(得分:2)

  

是否有另一种方式来渲染我重复的字段,就像它在   "预览" ?

要在Web UI中查看Legacy SQL的原始未展平输出,我曾经设置了相应的选项(单击显示选项)以实际将输出写入带有已检查Allow Large Results的表并且未选中Flatten Results
这实际上不仅将结果保存到表中,而且还以与预览相同的方式显示结果(因为它实际上是该表的预览)。为了确保表格在之后被删除 - 我已经专注了#34;数据集(临时),默认过期设置为1天(或小时 - 取决于您想要对垃圾的攻击程度),因此您不必担心该表 - 它会自动被删除为了你。想要注意:这是我们处理的一个非常常见的模式,并且不得不做额外的设置很无聊,所以我们最终得到了我们自己的自定义UI,可以自动为用户完成所有这些

答案 1 :(得分:2)

在旧版SQL中,默认情况下,BigQuery会平滑查询结果。这意味着两件事:

  1. RECORD字段的所有子字段都会传播到顶级字段,其名称已从record.subrecord.leaf更改为record_subrecord_leaf。将从架构中删除父记录。
  2. 所有重复的字段都转换为可选模式的字段,每个重复的值都扩展为自己的行。 (另请注意,此步骤与旧SQL中公开的FLATTEN函数非常相似。)
  3. 你在这里看到的是#2的产物。每个重复的值都成为它自己的行(正如你可以通过两个图像中左侧的行计数看到的那样),并且对于每个新行重复其他列的值。

    您可以通过几种方式阻止此行为并获得“不受欢迎的结果”。

    1. 使用标准SQL,正如您在原始问题中所述。所有标准SQL查询都返回不平整的结果。
    2. 使用旧版SQL时,将flattenResults参数设置为false。这还需要指定目标表并将allowLargeResults设置为false。如果要在UI中设置它们,可以在查询编辑器下方的Show Options面板中找到它们。如果你不想保留目的地表的临时性,米哈伊尔有一些很好的建议。
    3. 我应该注意,遗留SQL有很多极端情况,flattenResults设置为false,如果你开始编写更复杂的查询,可能会让你失望。一个突出的例子是您不能使用旧SQL在查询结果中输出多个独立重复的字段,但您可以使用标准SQL输出多个字段。这些问题不太可能在遗留SQL中解决,并且我们建议人们在遇到它们时使用标准SQL。

      如果您可以使用标准SQL提供有关速度慢得多的查询的更多详细信息(例如,旧版SQL中的作业ID,标准SQL中的作业ID,以供比较),我和BigQuery团队的其他成员将非常感兴趣进一步调查。

答案 2 :(得分:1)

您看到的内容称为Flatten

默认情况下,UI会使查询输出变平,目前没有选项可以显示您想要的查询结果。为了产生不平坦的结果,你必须写一张桌子,但那是不同的。