Я хочу извлечь данные в формате Json с помощью BigQuery. UDF или json_extract - PullRequest
0 голосов
/ 21 января 2020

У меня есть таблица со следующей структурой.

user_id int,

строка purchase_ids (в ​​формате Json)

JSON, содержащаяся в одной записи в этой таблице выглядит так:

user_id = 0001

1:{
  shop_id:1,
  product_id :1111,
  value: 1
},
2:{
  shop_id:1,
  product_id :2222,
  value: 1
},
3:{
  shop_id:1,
  product_id :3333,
  value: 1
},
.... Numbers fluctuate as records approach

Окончательный вывод для цели

| user_id | shop_id | product_id | value |
| 0001    | 1       |  1111      | 1     |
| 0001    | 1       |  2222      | 1     |
| 0001    | 1       |  3333      | 1     |

Я пытался выполнить следующий запрос, когда думал, но это не похоже, что все сделано правильно shop_id и product_id возвращают ноль.

CREATE TEMP FUNCTION jsonparse(json_row STRING)
  RETURNS STRING
  LANGUAGE js AS """
  var res = array();
  json_row.forEach(([key, value]) => {
     res = value;
  });
  return res
""";

with
parse as(
select
  user_id,
  jsonparse(purchase_ids) as pids
from
  sample
)


select
  user_id,
  JSON_EXTRAXT(pid,"$.shop_id") as shop_id,
  JSON_EXTRAXT(pid,"$.product_id") as product_id
from
  parse,
  unnest(pids,",") pid

Как вы понимаете это правильно в этой ситуации?

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Ниже приведена рабочая версия вашего варианта использования (BigQuery Standard SQL)

#standardSQL
CREATE TEMP FUNCTION jsonparse(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
  return JSON.parse(input).map(x=>JSON.stringify(x));
"""; 
WITH sample AS (
  SELECT "0001" AS user_id, 
  '''[{"shop_id": 1, "product_id" :1111, "value": 1},
  {"shop_id": 1, "product_id" :2222, "value": 1},
  {"shop_id": 1, "product_id" :3333, "value": 1}]''' AS purchase_ids
), parse AS (
  SELECT user_id,
    jsonparse(purchase_ids) AS pids
  FROM sample
) 
SELECT
  user_id,
  JSON_EXTRACT(pid,"$.shop_id") AS shop_id,
  JSON_EXTRACT(pid,"$.product_id") AS product_id,
  JSON_EXTRACT(pid,"$.value") AS value
FROM parse,
UNNEST(pids) pid

с результатом

Row user_id shop_id product_id  value    
1   0001    1       1111        1    
2   0001    1       2222        1    
3   0001    1       3333        1    
0 голосов
/ 21 января 2020

С моей точки зрения, ваш вариант использования должен использовать столбец NESTED и REAPEATED , который может быть представлен структурой json. Например, следующий запрос вернет искомый результат:

WITH users AS
  (SELECT "0001" as user_id, ARRAY<STRUCT<shop_id INT64, product_id INT64, value INT64>>[(1, 1111,1),
    (1, 2222,1), (1, 3333,1)] AS shops)
SELECT u.user_id, s.*
FROM users u, UNNEST(shops) s;

Для простоты вы можете создать столбец этого типа из консоли, чтобы попробовать этот подход, следуя этому руководству .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...