如何在 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 )