Невозможно извлечь пары ключ-значение из таблицы BigQuery, содержащей массивы и структуры.

Я интегрировал данные аналитики Firebase с google BigQuery, и каждый день создается новая таблица с отметкой DATE.

одна примерная таблица - "projectID.com_dev_sambhav_ANDROID.app_events_20170821"

Один образец таблицы показан ниже образец таблицы.

Мое требование - получить результат в желаемом ниже формате для event_dim.name = "notification_received" желаемый результат < / а>

Чтобы получить желаемый результат, я выполняю следующий запрос (стандартный SQL)

SELECT event.name
 (SELECT param.value.string_value FROM UNNEST(event_dim.params) AS param WHERE param.key="notification_title") as notification_title,
 (SELECT param.value.string_value FROM UNNEST(event_dim.params) AS param WHERE param.key="item_id") as item_id 
FROM `projectID.com_dev_sambhav_ANDROID.app_events_20*`, UNNEST(event_dim) as event  
WHERE event.name = "notification_received"

Но я получил эту ошибку

Ошибка: каждый аргумент функции является выражением, а не запросом. Чтобы использовать запрос в качестве выражения, запрос должен быть заключен в дополнительные круглые скобки, чтобы сделать его скалярным выражением подзапроса.

кто-нибудь может помочь мне решить эту проблему


person Debiprasad Mishra    schedule 23.08.2017    source источник
comment
Пожалуйста, Debiprasad, по возможности старайтесь использовать текст вместо изображений в своих вопросах, так как Google может проиндексировать текст, и тем, кто читает ваш вопрос, будет легче следить за информацией.   -  person Willian Fuks    schedule 23.08.2017


Ответы (1)


Проблема в запятой и псевдониме. Этот запрос работает:

#standardSQL
WITH `projectID.com_dev_sambhav_ANDROID.app_events_2017` AS(
  SELECT ARRAY< STRUCT<date STRING, name STRING, params ARRAY< STRUCT<key STRING, value STRUCT<string_value STRING> > > > > [STRUCT('20170814' AS date, 'notification_received' AS name, [STRUCT('notification_title' AS key, STRUCT('Amazing Offers two' AS string_value) AS value ), 
                                                                                                                STRUCT('firebase_screen_class' AS key, STRUCT('RetailerHomeActivity' AS string_value) AS value),
                                                                                                                STRUCT('notification_id' AS key, STRUCT('12345' AS string_value) AS value),
                                                                                                                STRUCT('firebase_screen_id' AS key, STRUCT('app' AS string_value) AS value),
                                                                                                                STRUCT('item_id' AS key, STRUCT('DEMO-02' AS string_value) AS value),
                                                                                                                STRUCT('firebase_screen' AS key, STRUCT('My Order' AS string_value) AS value)] AS params)] event_dim
)

SELECT
 event.name,
 (SELECT param.value.string_value FROM UNNEST(event.params) AS param WHERE param.key="notification_title") as notification_title,
 (SELECT param.value.string_value FROM UNNEST(event.params) AS param WHERE param.key="item_id") as item_id 
FROM `projectID.com_dev_sambhav_ANDROID.app_events_20*`, UNNEST(event_dim) as event  
WHERE event.name = "notification_received"

Если вы UNNEST поле event_dim и называете его event, тогда вам следует использовать этот псевдоним как ссылку в вашем запросе.

В качестве дополнения, вот еще один способ решения вашей проблемы (это просто еще одна возможность, поэтому у вас есть больше техник при работе с BigQuery):

#standardSQL
SELECT
  (SELECT date FROM UNNEST(event_dim)) date,
  (SELECT params.value.string_value FROM UNNEST(event_dim) event, UNNEST(event.params) params WHERE event.name = 'notification_received' AND params.key = 'notification_title') AS notification_title,
  (SELECT params.value.string_value FROM UNNEST(event_dim) event, UNNEST(event.params) params WHERE event.name = 'notification_received' AND params.key = 'item_id') AS item_id
FROM `projectID.com_dev_sambhav_ANDROID.app_events_2017`
WHERE EXISTS(SELECT 1 FROM UNNEST(event_dim) WHERE name = 'notification_received')

При обработке до терабайт этот запрос может работать достаточно хорошо.

person Willian Fuks    schedule 23.08.2017
comment
Но затем я использовал тот же запрос для другого события notification_opened, и он выдал ошибку. - person Debiprasad Mishra; 23.08.2017
comment
SELECT (SELECT date FROM UNNEST (event_dim)) date, (SELECT params.value.string_value FROM UNNEST (event_dim) event, UNNEST (event.params) params WHERE event.name = 'notification_opened' AND params.key = 'notification_title' ) AS notification_title, (SELECT params.value.string_value FROM UNNEST (event_dim) event, UNNEST (event.params) params WHERE event.name = 'notification_opened' AND params.key = 'item_id') AS item_id FROM shikhar-fa2b7.com_hul_sambhav_ANDROID.app_events_20* WHERE EXISTS (SELECT 1 ОТ UNNEST (event_dim) WHERE name = 'notification_opened') ` - person Debiprasad Mishra; 23.08.2017
comment
ошибка: скалярный подзапрос создал более одного элемента - person Debiprasad Mishra; 23.08.2017
comment
Это происходит, когда подзапрос находит несколько значений с одинаковым param.value.string_value. Одним из способов решения этой проблемы может быть получение результата в виде массива типа ARRAY((select params.value.string_value...), но это изменит структуру ваших данных. Сообщите мне, работает ли это для вас. - person Willian Fuks; 23.08.2017
comment
Я использовал первое предложение (WITH table AS), и оно сработало для notification_opened. Спасибо брат - person Debiprasad Mishra; 23.08.2017