使用限制查询附加到表不符合限制值

时间:2014-03-10 14:16:56

标签: google-bigquery

我正在尝试通过使用命令行工具从其他表中选择将数据附加到bigquery表,就像这样;

bq --nosync query --max_rows 0 --batch --destination_table=mydataset.append_test 'select * from [mydataset.source_table] limit 500'

此时,“source_table”的行数不到50亿,“append_test”不存在。

作业完成后,“append_test”已创建,但它包含3,605行,而不是我预期的500行。有人可以解释为什么会这样吗?

如果任何bigquery管理员想进一步调查,显示此行为的示例作业ID为342881999645:bqjob_r1947710924c85445_00000144ac3214f9_1

1 个答案:

答案 0 :(得分:2)

您所看到的是我们对如何返回重复字段(我们将它们展平)的设计选择的不幸结果。你的桌子有一个重复的字段;执行SELECT * FROM ... LIMIT 500时,将返回前500行。然后我们对这些行应用展平,这样我们就每个重复元素存储一行。因此,如果您在具有以下数据的表上运行SELECT *查询(一个字段a具有单个值,一个字段x具有重复值)

{a1, [x1, x2]},
{a2, [x3, x4]}

展平后你会得到以下结果:

{a1, x1},
{a1, x2},
{a2, x3},
{a2, x4},

踢球者认为,这只会从LIMIT角度计算为2行。我们意识到这不是大多数人想要或期望的。好消息是我们正在考虑修复它的方法。有几个原因导致它很棘手,我们还需要确保任何修复都是向后兼容的,以便人们不会对更改感到惊讶(可能我们会添加一个标记为'flatten_results'的标记)并默认为true)。

同时,如果你真的只想要500个值,你可以应用一个明确的展平:

SELECT * from FLATTEN(t1, field) LIMIT 500;