【问题标题】:Conflict in UNION ALL on STRUCT fieldsSTRUCT 字段上的 UNION ALL 冲突
【发布时间】: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


【解决方案1】:

这是预期的行为吗?

是的!

STRUCT 是 有序 字段的容器,每个字段都有一个类型(必需)和字段名称(可选)。 更多信息请访问Struct type

【讨论】:

  • 感谢 Mikhail,完全跳过了文档中的结构定义。一直认为 struct 是 json 字段的抽象,现在我发现我错了:)
  • 当然。检查他在评论中引用的 Elliott 的回答 - 在我看来这很棒:o)
  • 同意,将在这里使用它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2011-04-07
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多