使用Google BigQuery从JSON的多个属性值中提取值

时间:2019-05-19 08:57:36

标签: google-bigquery

我在GBQ中有一列这样的内容。

[{rank_start: 1, rank_end: 1, prize: {unit_type: 'UNIT_TYPE1', units: 50, unit_currency: 'UNIT_CURRENCY1'}}, {rank_start: 2, rank_end: 50, prize: {unit_type: 'UNIT_TYPE2', units: 20, unit_currency: 'UNIT_CURRENCY2'}}, {rank_start: 51, rank_end: 100, prize: {unit_type: 'UNIT_TYPE3', units: 10, unit_currency: 'UNIT_CURRENCY3'}}, {rank_start: 101, rank_end: 500, prize: {unit_type: 'UNIT_TYPE4', units: 5, unit_currency: 'UNIT_CURRENCY4'}}]

我想为GBQ中的每个排名范围提取诸如 rank_start,rank_end,unit_type,units,unit_currency 之类的值。

如果我们只有一个等级范围,即使用 JSON_EXTRACT()或JSON_EXTRACT_SCALAR(),我知道该怎么做...我会完成的。

但是问题是,我们在JSON中不仅仅具有属性值。

任何人都可以帮助我们如何在GBQ中做到这一点吗?

我尝试了这种粗略的方式,即用逗号分割多次,然后用':'分割,然后用'替换''',然后根据需要在每次分割中获取OFFSET值。

但是这会使代码过于笨拙,无法进行大量的REPLACE和SPLIT操作。

我想看看使用上述JSON函数在GBQ中是否有这样做?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

您可以遍历数组,并使用JSON_EXTRACT。根据您希望如何获得结果,是转换的最后一步。这是一个如何做的例子:

-- Recreating your scenario

WITH my_table AS (
  SELECT ['{"rank_start": 1, "rank_end": 1, "prize": {"unit_type": "UNIT_TYPE1", "units": 50, "unit_currency": "UNIT_CURRENCY1"}}', '{"rank_start": 2, "rank_end": 50, "prize": {"unit_type": "UNIT_TYPE2", "units": 20, "unit_currency": "UNIT_CURRENCY2"}}', '{"rank_start": 51, "rank_end": 100, "prize": {"unit_type": "UNIT_TYPE3", "units": 10, "unit_currency": "UNIT_CURRENCY3"}}', '{"rank_start": 101, "rank_end": 500, "prize": {"unit_type": "UNIT_TYPE4", "units": 5, "unit_currency": "UNIT_CURRENCY4"}}'] as my_column
)

-- Extracting information

SELECT 
  (SELECT ARRAY_AGG(CONCAT(
    JSON_EXTRACT(myrank, "$['rank_start']"), '-',
    JSON_EXTRACT(myrank, "$['rank_end']"), '-',
    JSON_EXTRACT(myrank, "$['prize'].unit_type"), '-',
    JSON_EXTRACT(myrank, "$['prize'].units"), '-',
    JSON_EXTRACT(myrank, "$['prize'].unit_currency")))
   FROM UNNEST(my_table.my_column) as myrank ) as fields
FROM
  my_table

以下是输出的示例:

Query output

Here是BigQuery文档,用于处理数组。