sql - 如何在 bigquery 中使用记录、结构和数组而不使它们变平
问题描述
我在大查询中有一个非常嵌套的表。这只是其中的一部分:
[
{
"mode": "NULLABLE",
"name": "id",
"type": "INTEGER"
},
{
"fields": [
{
"fields": [
{
"mode": "NULLABLE",
"name": "Type",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "Term",
"type": "STRING"
},
{
"fields": [
{
"mode": "NULLABLE",
"name": "TenderID",
"type": "STRING"
},
{
"mode": "NULLABLE",
"name": "CardType",
"type": "STRING"
],
"mode": "REPEATED",
"name": "EftInfo",
"type": "RECORD"
},
],
"mode": "REPEATED",
"name": "Trx",
"type": "RECORD"
}
],
"mode": "NULLABLE",
"name": "transactions",
"type": "RECORD"
}
]
我只想在每个字段内转换数据,但保留结构。我带来的是这个,但它使我的表变平,或者更确切地说,记录变为空而不是重复,我不知道如何将它们安排回来:
select
"id",
ARRAY( SELECT AS STRUCT CAST(Trx.Type AS INT64) Type,
CAST(Trx.Term AS INT64) Term,
CAST(Trx.TrxNum AS INT64) TrxNum,
ARRAY(SELECT AS STRUCT CAST(EftInfo.TenderID AS INT64 ) TenderID,
CAST(EftInfo.CardType AS INT64 ) CardType
)EftInfo) Trx ) transactions
from
dataset.table, UNNEST(transactions.Trx)Trx, UNNEST(Trx.EftInfo) EftInfo
解决方案
因此,在尝试了 bove 的所有组合之后,我得出了正确的结果,我可以解释。Hopefull,这将为某人节省时间:
SELECT id,
---here just (), because this is structure which cannot have multiple values
(SELECT AS STRUCT
CAST(transactions.Location AS INT64) Location,
CAST(transactions.StoreID AS INT64) StoreID,
---Here array, because this structure can have more entries
ARRAY(SELECT AS STRUCT
CAST(TenderID AS INT64 ) TenderID,
CAST(CardType AS INT64 ) CardType
FROM UNNEST(Trx.EftInfo) EftInfo) EftInfo)
FROM UNNEST(transactions.Trx)Trx)Trx
) transactions
from
my_ds.my_table
通过这种方式,人们可以深入到 bq 允许构建它的结构。控制正在发生的事情的一种好方法是 json,它可以在查询执行后看到。
推荐阅读
- python - 我可以在文本分类模型中添加一层元数据吗?
- python - 如何编辑我的 4 阶 Runge Kutta 代码来评估 2 阶 ODE?
- javascript - 如何从通知重定向到特定页面?
- javascript - 账户锁定实施
- r - R Markdown:抑制特定引用中的括号
- rust - 如何修复针对 or_insert / or_insert_with 的 clippy::or_fun_call 的 Clippy 警告?
- python - cross_val_score 中的岭回归器如何使用 alpha?
- html - 处理动态模板驱动表单的错误验证 - Angular
- http - Nginx 将所有非 www 流量重定向到端口 80 和 443 上的 www
- autosys - 如何使用 Autosys 中的文件监视器作业检查文件是否存在