Добавление нового столбца в таблицу Athena (Presto), рассчитанную на основе разницы между двумя строками - PullRequest
0 голосов
/ 12 февраля 2019

За последние несколько недель я написал конвейер, который собирает все данные о потоках кликов, которые транслируются с веб-сайта.Конвейер использует AWS следующим образом: S3> EC2 (для преобразований)> Афина (сканирует чистый разделенный s3).Новые данные поступают в конвейер каждые 24 часа, и это прекрасно работает - мои данные о потоках кликов легко запрашиваются.Однако теперь мне нужно добавить несколько дополнительных столбцов, т. Е. Время, потраченное на каждую страницу.Это может быть достигнуто путем сортировки по идентификатору пользователя, отметке времени, а затем по разнице между столбцом отметки времени в row_n1 и row_n2.Итак, мои вопросы:

1) Как я могу сделать это с помощью SQL-запроса?Я изо всех сил пытаюсь заставить его работать, но я думаю, что, как только я сделаю это, я могу запускать этот запрос каждые 24 часа для запуска новых данных о потоках кликов, поступающих в Афину.

2) Это разумный способдобавить дополнительные столбцы или новые сводные таблицы?например, создайте запрос, который будет запускаться каждые 24 часа для новых данных, чтобы добавить его в новую таблицу.

В идеале, я не хочу касаться какого-либо исходного кода, который был написан для выполнения "основного" ETLКонвейер

для справки моя таблица выглядит примерно так (с учетом нового времени столбца, проведенного на странице):

|userID |eventNum |Категория |Время |...... |timeSpentOnPage |'103-1023' '3' 'Просмотр' '12 -10-2019 ... '3s

Спасибо за любые указания / советы, которые могут быть предоставлены.

1 Ответ

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

Я не совсем уверен, что вы спрашиваете, и некоторые примеры данных и ожидаемый результат будут полезны.Например, я не совсем понимаю, что вы подразумеваете под row_n и row_m.

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

SELECT
  userID,
  timestamp - LAG(timestamp, 1) OVER (PARTITION BY userID ORDER BY timestamp) AS timeSpentOnPage
FROM events

* Оконная функция LAG возвращает значение из предыдущей строки (1 в данном случае означает предыдущую строку) вокно, заданное рамкой окна (в этом случае все строки с одинаковым userID и отсортированы по timestamp).Это похоже на GROUP BY, но для каждой строки, если это имеет смысл.

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


Естьнет способа сделать эквивалент UPDATE в Афине.Самым близким является создание "CTAS" (Create Table AS) для создания новой таблицы (которую с некоторой автоматизацией можно превратить в создание новых разделов для существующих таблиц).

Если выпредоставить дополнительную информацию о ваших данных, я могу пересмотреть этот ответ с другими предложениями.

...