如何在BigQuery中创建嵌套字段和数组的数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在BigQuery中创建嵌套字段和数组的数组相关的知识,希望对你有一定的参考价值。

我正在尝试根据json模式在BigQuery中创建一个表,我将其放入GCS并从那里推送到pub / sub主题。为此,我需要创建一些数组和嵌套字段。

通过使用struct和array_agg我可以实现struct数组,但是我不知道如何创建array的结构。

想象一下我有一个如下的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查询来获得此结果?

提前感谢您的帮助!

答案

您可能必须建立一个临时表来执行此操作。

此第一个create语句将使用一个非规范化表,将其转换为具有结构数组的表。

第二个create语句将使用该临时表,并将该数组嵌入到struct(数组)中。

您可以从第一个查询中删除内部结构,并在第二个查询中使用数组包装器来构建严格的数组结构。但这足够灵活,您可以创建一个结构数组,一个数组结构或两者的任意组合,次数最多可以达到BigQuery允许的最大15层。

这的最终结果可能是一个表,其中包含标准数据类型的一列(column1),以及称为OutsideArrayOfStructs的结构数组。该Struct具有两列“标准”数据类型,以及称为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 )

以上是关于如何在BigQuery中创建嵌套字段和数组的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 中取消嵌套多个数组?

BigQuery 从嵌套数组中选择和别名字段而不分组

如何通过匹配 ObjectId 字段从嵌套数组中删除对象

在 bigquery 中创建一个 udf 以匹配数组输入

BigQuery UPDATE 嵌套数组字段

在 Angular 和 mongoose 中创建包含嵌套数据的表