В конце концов, я построил JSON вручную с помощью конкатенации,
# UPLOAD AS JSON
UNLOAD ('SELECT CHR(123)||
\'"receiver_idfa":"\'||nvl(receiver_idfa,\'\')||\'",\'||
\'"brand":"\'||nvl(brand,\'\')||\'",\'||
\'"total":\'||nvl(total,0)||\',\'||
\'"screen_dpi":\'||nvl(screen_dpi,0)||\',\'||
\'"city":"\'||nvl(city,\'\')||\'",\'||
\'"wifi":\'||nvl(convert(integer,wifi),0)||\',\'||
\'"duration":\'||nvl(duration,0)||\',\'||
\'"carrier":"\'||nvl(carrier,\'\')||\'",\'||
\'"screen_width":\'||nvl(screen_width,0)||\',\'||
\'"time":\'||nvl("time",0)||\',\'||
\'"ts":"\'||nvl(ts,\'1970-01-01 00:00:00\')||\'",\'||
\'"month":\'||nvl(month,0)||\',\'||
\'"year":\'||nvl(year,0)||\',\'||
\'"day":\'||nvl(day,0)||\',\'||
\'"hour":\'||nvl(hour,0)||\',\'||
\'"minute":\'||nvl(minute,0)||
chr(125) from event_logs')
TO 's3://BUCKET/PREFIX/KEY'
WITH CREDENTIALS AS 'CREDENTIALS...'
GZIP
DELIMITER AS '\t'
;
Здесь
nvl
функции используются для замены нулей
convert
используется для замены булевых в целом
||
является оператором конкатенации в Redshift
chr
используется для генерации {
и }
персонажу
Эта операция не так быстро, как только выгрузка в формате CSV. Это займет 2-3 раза больше времени. Но, как нам нужно это сделать, это прекрасно. Я выгрузил около 1600 миллионов записей и успешно импортировал все из них в Spark.
Примечание: Размышление об искре не является эффективным способом. Существуют и другие форматы, которые быстрее, например, файл паркета, файл последовательности. Поэтому для искры это может быть не правильный путь. Но для разгрузки как JSON вы можете использовать это решение.
Это потрясающе и помогло мне много! Спасибо! – unpairestgood