Преобразовать столбец типа string в массив / запись, то есть вложив столбец - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь рассчитать и извлечь некоторые показатели из нескольких таблиц, которые есть в моем наборе данных для bigquery. Я хочу вызвать вложение на sfam, который является столбцом строк, который я не могу сделать сейчас, то есть он может иметь значения или быть нулевым. Так что цель состоит в том, чтобы преобразовать этот столбец в массив / запись ... это идея, которая пришла мне в голову, и я понятия не имею, как это сделать.

product и cart сгруппированы по key_web, dat_log, univ, suniv, fam и sfam.

Данные разбиты на юниверсы, именуемые univ, которые состоят из субвселенных, обозначаемых suniv. Подвселенные содержат семейства, называемые 'fam', которые могут иметь или не иметь подсемьи, обозначаемые как sfam. Я хочу вызвать вложение на prd.sfam, чтобы уменьшить результирующие столбцы.

Данные получены из Google Analytics для анализа трафика веб-сайта и действий пользователей.

Я пытаюсь получить информацию и показатели о каждом посетителе, количестве времени, которое он / она провел на определенных страницах, предпринятых действиях и так далее. Полученная таблица дает мне сумму времени, проведенного на этих страницах, сумму общего количества посещений за один день и разбивку, к какой категории он относится, таким образом, univ, suniv, fam и sfam столбцы типа string (sfam может быть нулевым, так как некоторые подселения suniv имеют только семейства fam и не переходят на уровень подсемей sfam.

  • dat_log: относится к дате

  • nrb_fp: количество просмотров страницы продукта

  • tps_fp: общее время, проведенное на указанной странице

Я пробовал разные методы, которые нашел в Интернете, но ни один из них не работал, поэтому я публикую свой код и проблему в надежде найти руководство и решение!

Более простой запрос:

 select
        prd.key_web
        , dat_log
        , prd.nrb_fp
        , prd.tps_fp
        , prd.univ
        , prd.suniv
        , prd.fam
        , prd.sfam
    from product as prd
    left join cart as cart
        on prd.key_web = cart.key_web
        and prd.dat_log = cart.dat_log
        and prd.univ = cart.univ
        and prd.suniv = cart.suniv
        and prd.fam = cart.fam
        and prd.sfam = cart.sfam

А это пример результата запроса по последним 6 столбцам в тексте и изображениях:

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

Я ограничил вывод только последними 6 столбцами, первые 3 - строкой, key_web и dat_log. Каждый fam состоит из нескольких sfam или ни одного (ноль), я хочу иметь возможность делать вложения на fam или sfam.

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

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

Это невозможно в BigQuery.Как объясняется в документации:

В настоящее время BigQuery имеет два следующих ограничения в отношении NULL и ARRAY:

BigQuery вызывает ошибку, если в результате запроса есть ARRAY, которые содержат элементы NULL, хотя такие массивы можно использовать внутри запроса.

То есть ваш результирующий набор не может содержать массив с NULL элементами.

1 голос
/ 15 июля 2019

Очевидно, что в BigQuery вы не можете вывести массив, который содержит NULL, но если по какой-то причине вам нужно как-то их сохранить - обходной путь - создать массив структур, а не массивы отдельных элементов

Например,(BigQuery Standard SQL), если вы попытаетесь выполнить ниже

SELECT ['a', 'b', NULL] arr1, ['x', NULL, NULL] arr2    

, вы получите ошибку: Array cannot have a null element; error in writing field arr1

Если вы попытаетесь выполнить ниже

SELECT ARRAY_AGG(STRUCT(val1, val2)) arr
FROM UNNEST(['a', 'b', NULL]) val1 WITH OFFSET
JOIN UNNEST(['x', NULL, NULL]) val2 WITH OFFSET
USING(OFFSET)

, выполучить результат

Row     arr.val1    arr.val2     
1       a           x    
        b           null     
        null        null       

Как вы можете видеть - приближаясь к этому пути - вы можете иметь даже оба элемента как NULL

...