【问题标题】:SPLIT key-value-pairs to Columns in Google BigQuery将键值对拆分为 Google BigQuery 中的列
【发布时间】:2021-03-05 00:16:25
【问题描述】:

我对 Google BigQuery 还很陌生,而且肯定在苦苦挣扎。

我的表格有以下内容:

+----------+----------------------------------------+
| order_id |               line_items               |
+----------+----------------------------------------+
|      123 | id:1|qy:1|sum:1.00;id:2|qy:6|sum:4.50; |
+----------+----------------------------------------+
|      456 | id:1|qy:3|sum:3.00;id:3|qy:4|sum:3.20; |
+----------+----------------------------------------+

我需要看起来像这样:

+----------+----+----+------+
| order_id | id | qy | sum  |
+----------+----+----+------+
|      123 |  1 |  1 | 1.00 |
|      123 |  2 |  6 | 4.50 |
|      456 |  1 |  3 | 3.00 |
|      456 |  3 |  4 | 3.20 |
+----------+----+----+------+

我在 line_items 中的键值对的数量是任意的(比这 3 个要多得多,但我需要提取这三个)。

我能够使以下 UNNEST 和 SPLIT 查询正常工作,但不幸的是我仍然有这些键值对...

这个

SELECT
  order_id,
  line_items
FROM
  `myTable`,
  UNNEST(SPLIT(line_items,"|")) line_items

带我到这里:

+----------+------------+
| order_id | line_items |
+----------+------------+
|      123 | id:1       |
|      123 | qy:1       |
|      123 | sum:1.00   |
|      123 | id:2       |
|      123 | qy:6       |
|      123 | sum:4.50;  |
|      456 | id:1       |
|      456 | qy:3       |
|      456 | sum:3.00   |
|      456 | id:3       |
|      456 | qy:4       |
|      456 | sum:3.20   |
+----------+------------+

所以我仍然不知道如何将这些键提取到列标题和值到列内容。

如果有人指出我正确的方向,我将不胜感激。

非常感谢!

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    select order_id, 
      ( select split(kv, ':')[offset(1)] from x.kvs kv where split(kv, ':')[offset(0)] = 'id') id,
      ( select split(kv, ':')[offset(1)] from x.kvs kv where split(kv, ':')[offset(0)] = 'qy') qy,
      ( select split(kv, ':')[offset(1)] from x.kvs kv where split(kv, ':')[offset(0)] = 'sum') sum
    from `project.dataset.table`,
    unnest(split(trim(line_items, ';'), ';')) items,
    unnest([struct(split(items,'|') as kvs)]) x
    -- order by order_id    
    

    如果应用于您问题中的样本数据 - 输出是

    上面的变体也很有用

    #standardSQL
    select order_id, 
      (select value from z.y where key = 'id') id,
      (select value from z.y where key = 'qy') qy,
      (select value from z.y where key = 'sum') sum
    from `project.dataset.table`,
    unnest(split(trim(line_items, ';'), ';')) items,
    unnest([struct(split(items,'|') as kvs)]) x,
    unnest([struct(array(
      select as struct 
        split(kv, ':')[offset(0)] as key, 
        split(kv, ':')[offset(1)] value 
      from x.kvs kv
    ) as y)]) z
    -- order by order_id 
    

    【讨论】:

    • 太棒了!那工作得很好。太感谢了!我现在将尝试了解您在那里做什么:D。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多