Обработайте несколько миллиардов записей из Redshift, используя пользовательскую логику - PullRequest
0 голосов
/ 22 сентября 2019

Я хочу применить пользовательскую логику к набору данных, помещенному в Redshift.Пример входных данных:

userid, event,  fileid, timestamp, ....
100000, start,  120,    2018-09-17 19:11:40
100000, done,   120,    2018-09-17 19:12:40
100000, done,   120,    2018-09-17 19:13:40
100000, start,  500,    2018-09-17 19:13:50
100000, done,   120,    2018-09-17 19:14:40
100000, done,   500,    2018-09-17 19:14:50
100000, done,   120,    2018-09-17 19:15:40

Это означает что-то вроде:

file 120:  start-----done-----done-----done-----done 
file 150:                      start-----done   
time    :  11:40----12:40----13:40-----14:40-----15:40

Но это должно выглядеть так:

file 120:  start-----done-----done 
file 150:                      start-----done   
time    :  11:40----12:40----13:40-----14:40-----15:40

Файл 120 былпрерывается после запуска файла 150

Имейте в виду, что много, если здесь разные пользователи и много разных файлов.

Очищенные данные должны быть:

userid, event,  fileid, timestamp, ....
100000, start,  120,    2018-09-17 19:11:40
100000, done,   120,    2018-09-17 19:12:40
100000, done,   120,    2018-09-17 19:13:40
100000, start,  500,    2018-09-17 19:13:50
100000, done,   500,    2018-09-17 19:14:50

У одного и того же пользователя не должно быть одновременно нескольких файлов.Таким образом, после запуска второго события из первого не должны удаляться из текущего набора данных.

Код прост, но на python и легко масштабируется, например, для Google Dataflow, но перемещает 100GB + из AWS в GCне очень хорошая идея.

Вопрос № 1: Возможно ли сделать это на SQL (используя специфические функции postgres / redshift) или лучше использовать Spark?(но не уверен, как это реализовать там)

Вопрос № 2: Любое предложение о том, может быть, лучше использовать AWS Batch или что-то еще, потому что с Apache Beam - это легко и довольно очевидно,но как работает AWS Batch и как разделить набор данных на куски (например, группы на пользователя) - это большой вопрос.Мое предложение состоит в том, чтобы каким-то образом выгрузить данные из красного смещения в корзину S3, но разделить их таким образом, чтобы отдельный файл = пользователь, а затем, если пакет aws поддерживает это - просто загрузите корзину, и каждый файл должен обрабатываться одновременно на уже созданных экземплярах.Не уверен, имеет ли это смысл.

1 Ответ

1 голос
/ 22 сентября 2019

Если вы хотите удалить строки, в которых fileid не соответствует самой последней start для пользователя, вы можете использовать lag(ignore nulls):

select t.*
from (select t.*,
             lag(case when event = 'start' then file_id end ignore nulls) over (partition by userid order by timestamp) as start_fileid
      from t
     ) t
where event = 'start' or start_fileid = fileid;
...