【问题标题】:BigQuery: Convert record of repeated in repeated recordBigQuery:在重复记录中转换重复记录
【发布时间】:2020-03-19 14:06:41
【问题描述】:

我有一个由这个 JSON 表示的 BigQuery 表(重复记录

{
  "createdBy": [
    "foo",
    "foo"
  ],
  "fileName": [
    "bar1",
    "bar2"
  ]
}

我需要转换成重复记录

[
      {
        "createdBy": "foo",
        "fileName": "bar1"
      },
      {
        "createdBy": "foo",
        "fileName": "bar2"
      }
]

为了进行这种转换,您为每个数组使用索引 0 并创建第一个对象,为第二个对象使用 1 索引,...

我使用 UDF 执行了这种转换,但问题是由于 BigQuery 限制我无法保存执行这种转换的 VIEW:

No support for CREATE TEMPORARY FUNCTION statements inside views

按照完整语句生成示例表和函数

CREATE TEMP FUNCTION filesObjectArrayToArrayObject(filesJson STRING)
  RETURNS ARRAY<STRUCT<createdBy STRING, fileName STRING>>
  LANGUAGE js AS """
    function filesObjectArrayToArrayObject_execute(files) {   
      var createdBy = files["createdBy"];
      var fileName = files["fileName"];
      var output = [];
      for(var i=0 ; i<createdBy.length ; i++) {
        output.push({ "createdBy" : createdBy[i], "fileName" : fileName[i] });
      }
      return output;
    }
    return filesObjectArrayToArrayObject_execute(JSON.parse(filesJson));
  """;

WITH sample_table AS (
  SELECT STRUCT<createdBy ARRAY<STRING>, fileName ARRAY<STRING>>(
    ["foo", "foo"],
    ["bar1", "bar2"]
  ) AS files
)

SELECT
  files AS filesOriginal,
  filesObjectArrayToArrayObject(TO_JSON_STRING(files)) AS filesConverted

FROM sample_table

有没有办法使用原生 BigQuery 语句执行相同类型的任务?

请注意:

  • 真实数据有超过 2 个键,但名称是固定的
  • 数组的长度不固定,可以是0,1,10,20,...

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    WITH sample_table AS (
      SELECT STRUCT<createdBy ARRAY<STRING>, fileName ARRAY<STRING>>(
        ["foo", "foo"],
        ["bar1", "bar2"]
      ) AS files
    )
    SELECT 
      ARRAY(
        SELECT STRUCT(createdBy, fileName) 
        FROM t.files.createdBy AS createdBy WITH OFFSET
        JOIN t.files.fileName AS fileName WITH OFFSET
        USING(OFFSET)
      ) files
    FROM `sample_table` t  
    

    有输出

    Row files.createdBy files.fileName   
    1   foo             bar1     
        foo             bar2       
    

    【讨论】:

    • 谢谢。我不得不使用LEFT JOIN,因为数组中的某些字段为空,但我使用实际数据创建了查询,它工作正常
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多