【问题标题】:Unnesting 3rd level dependency in Google BigQuery在 Google BigQuery 中取消嵌套 3 级依赖项
【发布时间】:2020-03-23 07:12:05
【问题描述】:

我正在尝试使用 BQ 替换现有表中的架构。 BQ 中的某些字段具有 3-5 级模式依赖关系。 对于前。 comsalesorders.comSalesOrdersInfo.storetransactionid 这个字段嵌套在两个字段下。 由于我使用它来替换现有表,因此我无法更改查询中的字段名称。 查询看起来与此类似

SELECT * REPLACE(comsalesorders.comSalesOrdersInfo.storetransactionid AS STRING) FROM CentralizedOrders_streaming.orderStatusUpdated, UNNEST(comsalesorders) AS comsalesorders, UNNEST(comsalesorders.comSalesOrdersInfo) AS comsalesorders.comSalesOrdersInfo

BQ 可以取消嵌套第一个模式字段,但会出现第二次嵌套问题。 我需要对此查询进行哪些更改才能将 UNNEST() 用于此类依赖模式?

【问题讨论】:

  • 请提供您的数据和预期结果的简化示例
  • 我不能使用这里描述的方法,因为我必须继续使用一致的模式和太多的依赖深度字段。 stackoverflow.com/questions/58920800/…
  • 预期结果与将 transactionid 架构更改为 STRING 的表完全相同。我通常使用 CLI 方法来操作模式,但在这种情况下我必须使用 SQL
  • “您的数据的简化示例”是我评论的主要部分:o)
  • 我会分享我能做的。数据是这样嵌套的 json 值 comsalesorders":[ {"comSalesOrdersInfo":{"storeTransactionID":"X1056-943462","ItemsWarrenty":0,"currencyCountry":"USD"}]

标签: sql google-bigquery


【解决方案1】:

鉴于您没有架构,我将尝试提供一个通用的答案。请尝试了解这两个查询之间的区别。

-- Provide an alias for each unnest (as if each is a separate table)
select c.stuff
from table
left join unnest(table.first_level_nested) a
left join unnest(a.second_level_nested) b
left join unnest(b.third_level_nested) c

-- b and c won't work here because you are 'double unnesting'
select c.stuff
from table
left join unnest(table.first_level_nested) a
left join unnest(first_level_nested.second_level_nested) b
left join unnest(first_level_nested.second_level_nested.third_level_nested) c

【讨论】:

  • 这个方法和我的实现有什么不同?我仍然收到二级嵌套错误
  • 编辑了我的答案以提供一般情况。在您的示例中,您的第二个 unnest 指的是 comsalesorders,但是当您取消嵌套时,您将其别名为 commercialdeliverygrouplist
  • 不错的收获。从我的角度来看,这是不正确的别名。我会改正的
【解决方案2】:

我不确定我是否理解您的问题,但正如我猜想的那样,您想将一种列类型更改为另一种类型,例如 STRING。

UNNEST 函数仅用于数组类型的列,例如:

"comsalesorders":["comSalesOrdersInfo":{}, comSalesOrdersInfo:{}, comSalesOrdersInfo:{}]

但不适用于这种列:

"comSalesOrdersInfo":{"storeTransactionID":"X1056-943462","ItemsWarrenty":0,"currencyCountry":"USD"}

因此,如果 a 没有误解您的问题,我会这样询问:

SELECT *, CAST(A.comSalesOrdersInfo.storeTransactionID as STRING) 
FROM `TABLE`, UNNEST(comsalesorders) as A

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多