如何在 BigQuery 中创建嵌套字段数组和数组
How to create array of nested fields and arrays in BigQuery
我正在尝试根据 json 模式在 BigQuery 中创建一个 table,我将把它放入 GCS 并从那里推送到 pub/sub 主题。我需要创建一些数组和嵌套字段才能实现这一点。
通过使用 struct 和 array_agg 我可以实现结构数组,但我不知道如何创建数组结构。
假设我有一个 json 架构,如下所示:
{
"vacancies": {
"id": "12",
"timestamp": "2019-08-22T04:04:26Z",
"version": "1.0",
"positionOpening": {
"documentId": {
"value": "505"
},
"statusCode": "Closed",
"registrationDate": "2014-05-07T16:11:22Z",
"lastUpdated": "2014-05-07T16:14:56Z",
"positionProfiles": [
{
"positionTitle": "Data Scientist for international company",
"positionQualifications": [
{
"experienceSummary": [
{"measure": {"value": "10","unitCode": "ANN"}},
{"measure": {"value": "4","unitCode": "ANN"}}
],
"educationRequirement": {
"programs": ["Physics","Computer Science"],
"programConcentrations": ["Data Analysis","Python Programming"]
},
"languageRequirement": [
{
"competencyName": "English",
"requiredProficiencyLevel": {"scoresNumeric": [{"value": "100"},{"value": "95"}]}
},
{
"competencyName": "French",
"requiredProficiencyLevel": {"scoresNumeric": [{"value": "95"},{"value": "70"}]}
}
]
}
]
}
]
}
}
}
我如何创建一个 SQL 查询来得到这个结果?
在此先感谢您的帮助!
您可能需要构建一个临时文件 table 才能执行此操作。
第一个 create 语句会将非规范化的 table 转换为具有结构数组的 table。
第二个 create 语句将采用该临时 table 并将数组嵌入到结构(的数组)中。
您可以从第一个查询中删除内部结构,并在第二个查询中使用数组包装器来构建严格的数组结构。但这应该足够灵活,您可以根据需要多次创建结构数组、数组结构或两者的任意组合,直到 BigQuery 允许您最大限度地达到 15 级深度。
最终结果可能是 table,其中包含一个标准数据类型的列 (column1),以及一个名为 OutsideArrayOfStructs 的结构数组。该结构有两列 "standard" 数据类型,以及一个名为 InsideArrayOfStructs.
的结构数组
CREATE OR REPLACE TABLE dataset.tempTable as (
select
column1,
column2,
column3,
ARRAY_AGG(
STRUCT(
ArrayObjectColumn1,
ArrayObjectColumn2,
ArrayObjectColumn3
)
) as InsideArrayOfStructs
FROM
sourceDataset.sourceTable
GROUP BY
column1,
column2,
column3 )
CREATE OR REPLACE TABLE dataset.finalTable as (
select
column1,
ARRAY_AGG(
STRUCT(
column2,
column3,
InsideArrayOfStructs
)
) as OutsideArrayOfStructs
FROM
dataset.tempTable
GROUP BY
Column1 )
我正在尝试根据 json 模式在 BigQuery 中创建一个 table,我将把它放入 GCS 并从那里推送到 pub/sub 主题。我需要创建一些数组和嵌套字段才能实现这一点。
通过使用 struct 和 array_agg 我可以实现结构数组,但我不知道如何创建数组结构。
假设我有一个 json 架构,如下所示:
{
"vacancies": {
"id": "12",
"timestamp": "2019-08-22T04:04:26Z",
"version": "1.0",
"positionOpening": {
"documentId": {
"value": "505"
},
"statusCode": "Closed",
"registrationDate": "2014-05-07T16:11:22Z",
"lastUpdated": "2014-05-07T16:14:56Z",
"positionProfiles": [
{
"positionTitle": "Data Scientist for international company",
"positionQualifications": [
{
"experienceSummary": [
{"measure": {"value": "10","unitCode": "ANN"}},
{"measure": {"value": "4","unitCode": "ANN"}}
],
"educationRequirement": {
"programs": ["Physics","Computer Science"],
"programConcentrations": ["Data Analysis","Python Programming"]
},
"languageRequirement": [
{
"competencyName": "English",
"requiredProficiencyLevel": {"scoresNumeric": [{"value": "100"},{"value": "95"}]}
},
{
"competencyName": "French",
"requiredProficiencyLevel": {"scoresNumeric": [{"value": "95"},{"value": "70"}]}
}
]
}
]
}
]
}
}
}
我如何创建一个 SQL 查询来得到这个结果?
在此先感谢您的帮助!
您可能需要构建一个临时文件 table 才能执行此操作。
第一个 create 语句会将非规范化的 table 转换为具有结构数组的 table。
第二个 create 语句将采用该临时 table 并将数组嵌入到结构(的数组)中。
您可以从第一个查询中删除内部结构,并在第二个查询中使用数组包装器来构建严格的数组结构。但这应该足够灵活,您可以根据需要多次创建结构数组、数组结构或两者的任意组合,直到 BigQuery 允许您最大限度地达到 15 级深度。
最终结果可能是 table,其中包含一个标准数据类型的列 (column1),以及一个名为 OutsideArrayOfStructs 的结构数组。该结构有两列 "standard" 数据类型,以及一个名为 InsideArrayOfStructs.
的结构数组CREATE OR REPLACE TABLE dataset.tempTable as ( select column1, column2, column3, ARRAY_AGG( STRUCT( ArrayObjectColumn1, ArrayObjectColumn2, ArrayObjectColumn3 ) ) as InsideArrayOfStructs FROM sourceDataset.sourceTable GROUP BY column1, column2, column3 ) CREATE OR REPLACE TABLE dataset.finalTable as ( select column1, ARRAY_AGG( STRUCT( column2, column3, InsideArrayOfStructs ) ) as OutsideArrayOfStructs FROM dataset.tempTable GROUP BY Column1 )