将数据从键值对提取到 Google Bigquery 中的列标题
Posted
技术标签:
【中文标题】将数据从键值对提取到 Google Bigquery 中的列标题【英文标题】:Extracting data from key-value pairs to column headlines in Google Bigquery 【发布时间】:2020-11-25 01:25:51 【问题描述】:感谢Mikhail's help,我能够从我的电子商务数据中的字符串中提取键值对。
但是现在我的另一个报告有一个稍微不同的问题,我无法解决。
输入:
+----------+---------------------------------------------------------------+
| order_id | line_items |
+----------+---------------------------------------------------------------+
| 123 | id:1|qy:1|sum:1.00|name:papaya;id:2|qy:6|sum:4.50|name:apple; |
+----------+---------------------------------------------------------------+
| 456 | id:1|qy:3|sum:3.00|name:papaya;id:2|qy:1|sum:0.75|name:apple; |
+----------+---------------------------------------------------------------+
line_items 列中每行的购买数量是任意的(以“;”分隔),并且信息远不止 id、quantity、sum 和 name。
但现在我只需要拉那些(可能会改变,但我
想想/希望我能做到这一点,一旦我了解它是如何完成的)。
产品可能会随着时间的推移而增加。但是我想,当找不到相应的搜索字符串(假设我将来必须添加“cherry”)时,那没关系(只会输出null),我可以一旦我有更多产品,请更新查询。
期望的输出:
+----------+-----------+------------+----------+-----------+
| order_id | qy_Papaya | sum_Papaya | qy_Apple | sum_Apple |
+----------+-----------+------------+----------+-----------+
| 123 | 1 | 1.00 | 6 | 4.50 |
+----------+-----------+------------+----------+-----------+
| 456 | 3 | 3.00 | 1 | 0.75 |
+----------+-----------+------------+----------+-----------+
我在solution from Mikhail 的基础上做了很多尝试,但我无法将名称值带入列标题。
如果有人再次指出我正确的方向,那就太好了。 提前非常感谢!
【问题讨论】:
【参考方案1】:以下是 BigQuery 标准 SQL
#standardSQL
with temp as ( - temp CTE is exact solution from answer you referenced in your question
select order_id,
( select split(kv, ':')[offset(1)] from x.kvs kv where split(kv, ':')[offset(0)] = 'name') name,
( 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
)
select order_id,
max(if(name = 'papaya', qy, '')) as qy_papaya,
max(if(name = 'papaya', sum, '')) as sum_papaya,
max(if(name = 'apple', qy, '')) as qy_apple,
max(if(name = 'apple', sum, '')) as sum_apple
from temp
group by order_id
如果应用于您问题中的样本数据 - 输出是
【讨论】:
再次完美运行。再次非常感谢,米哈伊尔。以上是关于将数据从键值对提取到 Google Bigquery 中的列标题的主要内容,如果未能解决你的问题,请参考以下文章