Arhn - архитектура программирования

Unnest Hit BigQuery - повторяющиеся значения)

Я пытаюсь создать главное представление группы в свойствах, которые были импортированы в большой запрос, но, похоже, с помощью unnest (совпадений) SQL дублирует данные, что приводит к неточным значениям доходов и т. Д.

Я пытаюсь понять, почему unnest вызвало это, но я не могу этого понять.

SELECT Date, hostname, channelGrouping, sum(transactionRevenue) as Revenue, sum(Shipping) as Shipping, sum(visits) as Sessions, sum(bounces) as Bounces, sum(transactions) as Transactions
    FROM
        (SELECT Date, h.page.hostname as hostname, channelGrouping, totals.transactionRevenue, totals.visits, h.transaction.transactionShipping as shipping, totals.bounces, totals.transactions
        FROM `xxxxxxxxx.ga_sessions_*`, UNNEST(hits) AS h
        WHERE _TABLE_SUFFIX BETWEEN '20170401' AND '20170509'
        UNION ALL
        SELECT Date, h.page.hostname as hostname, channelGrouping, totals.transactionRevenue, totals.visits, h.transaction.transactionShipping as shipping, totals.bounces, totals.transactions
        FROM `xxxxxxxxx.ga_sessions_*`, UNNEST(hits) AS h
        WHERE _TABLE_SUFFIX BETWEEN '20170401' AND '20170509'
        UNION ALL
        SELECT Date, h.page.hostname as hostname, channelGrouping, totals.transactionRevenue, totals.visits, h.transaction.transactionShipping as shipping, totals.bounces, totals.transactions
        FROM `102674002.ga_sessions_*`, UNNEST(hits) AS h
        WHERE _TABLE_SUFFIX BETWEEN '20170401' AND '20170509'
        UNION ALL
        SELECT Date, h.page.hostname as hostname, channelGrouping, totals.transactionRevenue, totals.visits, h.transaction.transactionShipping as shipping, totals.bounces, totals.transactions
        FROM `xxxxxxxxx.ga_sessions_*`, UNNEST(hits) AS h
        WHERE _TABLE_SUFFIX BETWEEN '20170401' AND '20170509'
        UNION ALL
        SELECT Date, h.page.hostname as hostname, channelGrouping, totals.transactionRevenue, totals.visits, h.transaction.transactionShipping as shipping, totals.bounces, totals.transactions
        FROM `xxxxxxxxx.ga_sessions_*`, UNNEST(hits) AS h
        WHERE _TABLE_SUFFIX BETWEEN '20170401' AND '20170509')
    Group By Date, hostname, channelGrouping
    Order by Date
23.06.2017

Ответы:


1

Это может помочь:

SELECT
  date,
  channelGrouping,
  SUM(Revenue) Revenue,
  SUM(Shipping) Shipping,
  SUM(bounces) bounces,
  SUM(transactions) transactions,
  hostname,
  COUNT(date) sessions
FROM(
  SELECT 
    date,
    channelGrouping,
    totals.totaltransactionrevenue / 1e6 Revenue,
    ARRAY((SELECT DISTINCT page.hostname FROM UNNEST(hits) hits WHERE page.hostname IS NOT NULL)) hostnames,
    (SELECT SUM(hits.transaction.transactionshipping) / 1e6 FROM UNNEST(hits) hits) Shipping,
    totals.bounces bounces,
    totals.transactions transactions
  FROM `project_id.dataset_id.ga_sessions_*`
  WHERE 1 = 1
  AND ARRAY_LENGTH(ARRAY((SELECT DISTINCT page.hostname FROM UNNEST(hits) hits WHERE page.hostname IS NOT NULL))) > 0
  AND _TABLE_SUFFIX BETWEEN '20170601' AND '20170609'

  UNION ALL
  (...)

),
UNNEST(hostnames) hostname
GROUP BY
  date, channelGrouping, hostname

Обратите внимание, что в этом запросе я избегал применения операции UNNEST в поле hits и делаю это только внутри подзапросов.

Чтобы понять, почему это так, вы должны понять, как данные ga объединяется в BigQuery. Обратите внимание, что в основном у нас есть 2 типа данных: данные уровня session и уровень hits. Каждый клиент, посещающий ваш сайт, в конечном итоге создает строку в BigQuery, например:

{fullvisitorid: 1, visitid:1, date: '20170601', channelGrouping: "search", hits: [{hitNumber: 1, page: {hostname: "yourserverhostname"}}, {hitNumber: 2, page: {hostname: "yourserverhostname"}}, totals: {totalTransactionRevenue:0, bounces: 0}]

Если тот же клиент возвращается днем ​​позже, он генерирует другую строку в BQ, что-то вроде:

{fullvisitorid: 1, visitid:2, date: '20170602', channelGrouping: "search", hits: [{hitNumber: 1, page: {hostname: "yourserverhostname"}}, {hitNumber: 2, page: {hostname: "yourserverhostname"}}, totals: {totalTransactionRevenue:50000000, bounces: 2}]

Как видите, поля за пределами ключа hits связаны с уровнем сеанса (и поэтому каждое обращение, то есть каждое взаимодействие клиента на вашем веб-сайте, добавляет сюда еще одну запись). Когда вы применяете UNNEST, вы в основном применяете перекрестное соединение со всеми значениями внутри массива с внешними полями.

Именно здесь и происходит дублирование!

В предыдущем примере, если мы применим UNNEST к полю hits, вы получите что-то вроде:

fullvisitorid    visitid    totals.totalTransactionRevenue    hits.hitNumber
1                1          0                                 1
1                1          0                                 2
1                2          50000000                          1
1                2          50000000                          2

Обратите внимание, что для каждого попадания в поле hits внешние поля, такие как totals.totalTransactionRevenue, дублируются для каждого hitNumber, произошедшего внутри hits ARRAY.

Итак, если позже вы примените некоторую операцию типа SUM(totals.totalTransactionRevenue), вы в конечном итоге суммируете это поле, умноженное на каждое попадание, которое клиент имел в этом visitid.

Я стараюсь избегать (дорогостоящей, в зависимости от объема данных) операции UNNEST в поле hits, и я делаю это только в подзапросах (где деактивация происходит только на уровне строки, которая не дублирует данные).

23.06.2017
  • Я собирался опубликовать свой ответ, но вы меня опередили :) Хороший ответ! Одна вещь, которую я пытался выяснить из исходного вопроса, - это намерение группировки по hostname. Похоже, нет смысла пытаться связать с ним суммы, поскольку имена хостов разбросаны по hits. 23.06.2017
  • Спасибо за комментарий @ElliottBrossard :)! Я согласен с hostname, не уверен, почему OP хочет это поле. На нашем веб-сайте я заметил, что для получения почти 20% дохода клиенты открывают свои сеансы уже на страницах корзины / оформления заказа, поэтому я подумал, что, возможно, путем группировки по hostname можно провести какой-то анализ этого типа трафика ( но не уверен, что это истинное намерение OP). 23.06.2017
  • Спасибо за вашу помощь, свойства имеют дело с веб-сайтами mutilpe, поэтому я хотел, чтобы был простой способ фильтрации входящих / исходящих имен хостов веб-сайтов. Я пытаюсь заставить некоторые из этих данных работать с datastudio. 26.06.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..