将数据从键值对提取到 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 列中每行的购买数量是任意的(以“;”分隔),并且信息远不止 idquantity、sumname。 但现在我只需要拉那些(可能会改变,但我 想想/希望我能做到这一点,一旦我了解它是如何完成的)。 产品可能会随着时间的推移而增加。但是我想,当找不到相应的搜索字符串(假设我将来必须添加“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 中的列标题的主要内容,如果未能解决你的问题,请参考以下文章

如何从键值对列表中创建 Spark Row

如何从键值对数组创建对象?

使用 Lodash 从键值对数组中创建对象

Python字典_术语

RestKit 对象映射:如何从键值映射到新对象/关系?

如何从飞镖颤动中的键或键值对获取索引