BigQuery использует условия для создания таблицы из других таблиц - PullRequest
1 голос
/ 30 апреля 2020

Я сталкиваюсь с серьезной блокировкой на моем проекте. Вот краткое изложение того, что я хотел бы сделать:

У меня есть большой почасовой файл (10 Go) со следующей выдержкой (без заголовка):

ID_A|segment_1,segment_2
ID_B|segment_2,segment_3,segment_4,segment_5
ID_C|segment_1
ID_D|segment_2,segment_4

Каждый идентификатор (от A до D) может быть связан с одним или несколькими сегментами (от 1 до 5).

Я хотел бы обработать этот файл, чтобы получить следующий результат (файл результатов содержит заголовок):

ID|segment_1|segment_2|segment_3|segment_4|segment_5
ID_A|1|1|0|0|0
ID_B|0|1|1|1|1
ID_C|1|0|0|0|0
ID_D|0|1|0|1|0

1 означает, что идентификатор включен в сегмент, 0 означает, что это не так.

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

Я хотел бы использовать BigQuery для выполнения этой операции. Возможно ли сделать такую ​​задачу в BigQuery? Как это можно сделать?

Спасибо всем за помощь.

С уважением

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Позвольте мне предположить, что файл загружен в таблицу BQ со столбцом id и столбцом segments (который является строкой). Тогда я бы порекомендовал сохранить значения результата в виде массива , но это не ваш вопрос.

Для создания таблицы можно использовать следующие значения select:

select id,
       countif(segment = 'segment_1') as segment_1,
       countif(segment = 'segment_2') as segment_2,
       countif(segment = 'segment_3') as segment_3,
       countif(segment = 'segment_4') as segment_4,
       countif(segment = 'segment_5') as segment_5
from staging s cross join
     unnest(split(segments, ',')) as segment
group by id;
0 голосов
/ 30 апреля 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT id, 
  IF('segment_1' IN UNNEST(list), 1, 0) AS segment_1,
  IF('segment_2' IN UNNEST(list), 1, 0) AS segment_2,
  IF('segment_3' IN UNNEST(list), 1, 0) AS segment_3,
  IF('segment_4' IN UNNEST(list), 1, 0) AS segment_4,
  IF('segment_5' IN UNNEST(list), 1, 0) AS segment_5
FROM `project.dataset.table`,
UNNEST([STRUCT(SPLIT(segments) AS list)])   

Выше предполагается, что у вас есть данные в таблице, как показано ниже TCE

WITH `project.dataset.table` AS (
  SELECT 'ID_A' id, 'segment_1,segment_2' segments UNION ALL
  SELECT 'ID_B', 'segment_2,segment_3,segment_4,segment_5' UNION ALL
  SELECT 'ID_C', 'segment_1' UNION ALL
  SELECT 'ID_D', 'segment_2,segment_4' 
)

, если применить вышеуказанный запрос к таким данным - результат будет

Row id      segment_1   segment_2   segment_3   segment_4   segment_5    
1   ID_A    1           1           0           0           0    
2   ID_B    0           1           1           1           1    
3   ID_C    1           0           0           0           0    
4   ID_D    0           1           0           1           0   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...