Преобразование массивов во вложенные поля в BigQuery - PullRequest
0 голосов
/ 25 февраля 2019

Я передаю журналы Stackdriver в Bigquery, и они заканчиваются в поле textPayload в следующем формате:


member_id_hashed=123456789,

member_age -> Float(37.0,244),

operations=[92967,93486,86220,92814,92943,93279,...],

scores=[3.214899,2.3641025E-5,2.5823574,2.3818345,3.9919448,0.0,...],

[etc]

Затем я определяю запрос / представление для таблицы с необработанным журналированиемследующие записи:

SELECT
member_id_hashed as member_id, member_age,
split(operations,',') as operation,
split(scores,',') as score 
FROM
(
  SELECT
  REGEXP_EXTRACT(textPayload, r'member_id=([0-9]+)') as member_id_hashed,
  REGEXP_EXTRACT(textPayload, r'member_age -> Float\(([0-9]+)') as member_age,
  REGEXP_EXTRACT(textPayload, r'operations=\[(.+)') as operations,
  REGEXP_EXTRACT(textPayload, r'scores=\[(.+)') as scores
  from `myproject.mydataset.mytable`
)

, в результате чего получается одна строка с двумя полями и двумя массивами:

enter image description here

В идеале, для дальнейшегоанализ, я хотел бы, чтобы два массива были вложенными (например, operation.id и operation.score) или выравнивали массивы построчно, сохраняя позиции (т.е. строка 1 массива 1 должна появляться рядом со строкой 1 массива 2 и т. д.):

enter image description here

Может кто-нибудь указать мне способ сделать вложенные поля из массивов или сгладить массивы?Я попытался аннестировать и присоединиться, но в результате я получил бы слишком много возможных кросс-комбинаций.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете сжать два массива следующим образом.Он выводит массив с идентификаторами операций и получает индекс каждого элемента, а затем выбирает соответствующий элемент массива с оценками.Обратите внимание, что это предполагает, что массивы имеют одинаковое количество элементов.Если они этого не делают, вы можете использовать SAFE_OFFSET вместо OFFSET, чтобы получить значение NULL, например, если число идентификаторов превышает число.

SELECT
  member_id_hashed, member_age,
  ARRAY(
    SELECT AS STRUCT id, split(scores,',')[OFFSET(off)] AS score
    FROM UNNEST(split(operations,',')) AS id WITH OFFSET off
    ORDER BY off
  ) AS operations
FROM (
  SELECT
    REGEXP_EXTRACT(textPayload, r'member_id=([0-9]+)') as member_id,
    REGEXP_EXTRACT(textPayload, r'member_age -> Float\(([0-9]+)') as member_age,
    REGEXP_EXTRACT(textPayload, r'operations=\[(.+)') as operations,
    REGEXP_EXTRACT(textPayload, r'scores=\[(.+)') as scores
  from `myproject.mydataset.mytable`
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...