将键值对拆分为 Google BigQuery 中的列 [英] SPLIT key-value-pairs to Columns in Google BigQuery

查看:24
本文介绍了将键值对拆分为 Google BigQuery 中的列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 Google BigQuery 还很陌生,而且肯定很挣扎.

I am quite new to Google BigQuery and definitely struggling.

我的表有以下内容:

+----------+----------------------------------------+
| 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 中的键值对的数量是任意的(并且比这三个多得多,但我需要提取这三个).

The amount of key value pairs I have in line_items is arbitrary (and there are much more than those 3, but I would need to extract those three).

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

I was able to get the following UNNEST and SPLIT query working, but unfortunately I still have these key-value pairs...

这个

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   |
+----------+------------+

所以我还是不太懂,如何将这些键提取到列标题和列内容的值中.

So I am still not really able, how to extract these keys to column headlines and the value to the column content.

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

I would highly appreciate if someone pointed me in the right direction.

非常感谢!

推荐答案

以下是 BigQuery Standard SQL

Below is for BigQuery Standard 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    

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

If to apply to sample data from your question - output is

以上的以下变体也很有用

Below variation of above can be useful too

#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 

这篇关于将键值对拆分为 Google BigQuery 中的列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆