2016-10-12 2 views
5

Я пытаюсь выполнить очень простой запрос для событий Firebase, хранящихся в Google BigQuery, но я не могу найти способ сделать это.Выберите несколько параметров событий в одной строке для событий Firebase, хранящихся в Google BigQuery

В Android приложение, I'm записи в журнал события, как это:

Bundle params = new Bundle(); 
params.putInt("productID", productId); 
params.putInt(FirebaseAnalytics.Param.VALUE, value); 
firebaseAnalytics.logEvent("productEvent", params); 

Так, в BigQuery у меня есть что-то вроде этого:

 ___________________ _______________________ ____________________________ 
| event_dim.name | event_dim.params.key | event_dim.params.int_value | 
|___________________|_______________________|____________________________| 
| productEvent  | productID    | 25       | 
|     |_______________________|____________________________| 
|     | value     | 1253      | 
|___________________|_______________________|____________________________|

Когда я получаю данные из этот стол я получаю два ряда:

 ___________________ _______________________ ____________________________ 
|event_dim.name  | event_dim.params.key | event_dim.params.int_value | 
|___________________|_______________________|____________________________| 
| productEvent  | productID    | 25       | 
| productEvent  | value     | 12353      |

Но что мне действительно нужно является предложением SELECT из этой таблицы, чтобы получить следующие данные:

 ___________________ _____________ _________ 
| name   | productID | value | 
|___________________|_____________|_________| 
| productEvent  | 25   | 12353 |

Любая идея или предложение?

+0

У вас низкая скорость. Важно отметить, что вы должны пометить принятые ответы, используя отметку слева от опубликованного ответа ниже голосования. Это увеличит вашу ставку. Посмотрите, как это работает, просматривая эту ссылку: http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work#5235 – Pentium10

+0

Вы правы, спасибо –

ответ

7

Вы можете поворачивать значения в столбцы, как этот

SELECT 
    event_dim.name as name, 
    MAX(IF(event_dim.params.key = "productID", event_dim.params.int_value, NULL)) WITHIN RECORD productID, 
    MAX(IF(event_dim.params.key = "value", event_dim.params.int_value, NULL)) WITHIN RECORD value, 
FROM [events] 

В случае, если вы хотите, чтобы произвести эту команду с помощью SQL см этого решения: Pivot Repeated fields in BigQuery

+0

Это прекрасно работает. Благодаря! Но используя MAX не получится для string_value, правильно? –

+1

Использование MAX 'will' также для строкового значения. проверьте также http://stackoverflow.com/a/33769831/5221944 - как ответ, предлагающий –

4

Использования standard SQL (снимите флажок «Использовать Наследство SQL» под «Показать параметры» в пользовательском интерфейсе), можно выразить запрос как:

SELECT 
    event_dim.name as name, 
    (SELECT value.int_value FROM UNNEST(event_dim.params) 
    WHERE key = "productID") AS productID, 
    (SELECT value.int_value FROM UNNEST(event_dim.params) 
    WHERE key = "value") AS value 
FROM `dataset.mytable` AS t, 
    t.event_dim AS event_dim; 

Edit: обновленный пример включить int_value как часть value на основе приведенного ниже комментария. Здесь приведен пример, который также демонстрирует подход:

WITH T AS (
    SELECT ARRAY_AGG(event_dim) AS event_dim 
    FROM (
    SELECT STRUCT(
     "foo" AS name, 
     ARRAY<STRUCT<key STRING, value STRUCT<int_value INT64, string_value STRING>>>[ 
      ("productID", (10, NULL)), ("value", (5, NULL)) 
     ] AS params) AS event_dim 
    UNION ALL 
    SELECT STRUCT(
     "bar" AS name, 
     ARRAY<STRUCT<key STRING, value STRUCT<int_value INT64, string_value STRING>>>[ 
      ("productID", (13, NULL)), ("value", (42, NULL)) 
     ] AS params) AS event_dim 
) 
) 
SELECT 
    event_dim.name as name, 
    (SELECT value.int_value FROM UNNEST(event_dim.params) 
    WHERE key = "productID") AS productID, 
    (SELECT value.int_value FROM UNNEST(event_dim.params) 
    WHERE key = "value") AS value 
FROM T AS t, 
    t.event_dim AS event_dim; 
+0

Это выглядит великолепно @Elliott Brossard. к сожалению, я получаю сообщение об ошибке при запуске этого запроса: Ошибка: не найден: Таблица : event_dim.params –

+0

с схемой, которую вы указали в своем вопросе - запрос Elliott 'must' работает и' is' работает. Таким образом, либо у вас есть немного другая схема, либо вы что-то еще - как опечатка в запросе. и т. д. Просто рекомендую играть больше с этим –

+0

Не возражаете ли вы поделиться запросом, который вы пытались запустить (или идентификатором задания для неудачного выполнения)? Михаил прав, учитывая ваш первоначальный вопрос, то, что я написал, будет работать, если вы замените имя таблицы my-dataset.mytable. –

Смежные вопросы