【发布时间】:2018-04-14 03:14:36
【问题描述】:
此查询正常工作:
SELECT STRUCT<price STRUCT<previous FLOAT64, `current` FLOAT64, currency STRING>> (STRUCT(120.0 AS previous, 110.0 AS `current`, "BR")) UNION ALL
SELECT STRUCT<price STRUCT<previous FLOAT64, `current` FLOAT64, currency STRING>> (STRUCT(121.0 AS previous, 111.0, "BR"))
但是如果我们改变字段定义的顺序,像这样(交换字段currency 和current):
SELECT STRUCT<price STRUCT<previous FLOAT64, `current` FLOAT64, currency STRING>> (STRUCT(120.0 AS previous, 110.0 AS `current`, "BR")) UNION ALL
SELECT STRUCT<price STRUCT<previous FLOAT64, currency STRING, `current` FLOAT64>> (STRUCT(121.0 AS previous, "BR", 111.0))
我们得到错误:
UNION ALL 中的第 1 列具有不兼容的类型:STRUCT>、STRUCT> 在 [2:1]
这是预期的行为吗?
我问的原因是我们有 2 个表,一个是固定的,但另一个是通过对 NEWLINE_DELIMITED_JSON 文件使用架构自动检测每小时构建的。由于我们无法在字段上设置任何顺序,有时它们定义的顺序会发生变化,我们的代码会中断。
由于我们对定义字段的顺序没有太多控制,我想知道 BigQuery 是否可以在内部对 STRUCT 字段进行某种动态映射以用于 UNION 操作(或者如果我做错了什么并且有解决方法)
【问题讨论】:
-
如果性能不是大问题,请查看我在stackoverflow.com/a/48192791/6253347 中的回答。
-
感谢@ElliottBrossard!我已经看到了您对这个问题的回答,但现在才意识到这是同一问题的解决方案!肯定会在这里使用它!
-
@ElliottBrossard 不知道您是否可以对此发表评论,刚刚看到this issue 并且看起来,对于 BigQuery,最好将 struct 定义为一组有序的值。仍然不太明白为什么会这样,例如自动检测功能可能不适用。似乎(在我有限的知识中;))没有排序的结构更适合定义类似 json 的字段(我也很清楚这对团队来说是低优先级的事情,我只是主要好奇这里)
-
拥有以这种方式工作的 JSON 或文档类型以及 there is an open feature request for it 是有意义的,但对其他功能的兴趣几乎没有,因此很难确定优先级: (
-
我明白了。完全理解,使用BQ有一段时间了,现在才发现这个问题,所以这可能是人们不会那么容易找到的东西。尽管如此,考虑到 BQ 的发展速度,这种支持很快就会投入生产也就不足为奇了 :)。再次感谢您的帮助!
标签: google-bigquery