1

Мы переезжаем из Redshift в Spark. У меня есть таблица в Redshift, которую мне нужно экспортировать в S3. С S3 это будет передаваться в Apache Spark (EMR).Экспорт данных из Amazon Redshift as JSON

Я нашел, что есть только один способ экспорта данных из Redshift. И это команда UNLOAD. И выгрузка не может экспортировать типизированные данные. Он экспортирует csv, который представляет собой таблицу строк. На основе разных форматов (цитата, разделитель и т. Д.) Spark, похоже, не хорошо его распознает. Поэтому я ищу способ разгрузить их и убедиться, что их читают искру с надлежащим типом.

Есть ли способ выгрузить данные как JSON или другой типизированный формат, который распознается Spark?

ответ

2

В конце концов, я построил 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' 
; 

Здесь

  1. nvl функции используются для замены нулей
  2. convert используется для замены булевых в целом
  3. || является оператором конкатенации в Redshift
  4. chr используется для генерации { и } персонажу

Эта операция не так быстро, как только выгрузка в формате CSV. Это займет 2-3 раза больше времени. Но, как нам нужно это сделать, это прекрасно. Я выгрузил около 1600 миллионов записей и успешно импортировал все из них в Spark.

Примечание: Размышление об искре не является эффективным способом. Существуют и другие форматы, которые быстрее, например, файл паркета, файл последовательности. Поэтому для искры это может быть не правильный путь. Но для разгрузки как JSON вы можете использовать это решение.

+0

Это потрясающе и помогло мне много! Спасибо! – unpairestgood

1

Поскольку Redshift является РСУБД на основе postgresql; возможно, не будет простого способа извлечь json. После выполнения команды выгрузки, которая выплевывает «CSV», вы можете преобразовать этот файл CSV в формате JSON

Вот GitHub проект: https://github.com/darwin/csv2json

Если вы хотите инструмент командной на основе: https://www.npmjs.com/package/csvtojson

1

Посмотрите библиотеку spark-redshift, которая позволяет Apache Spark делать массовые чтения из Redshift с использованием UNLOAD; он автоматически управляет обработкой экранирования и схемы.

Вы можете запускать запросы Spark непосредственно против данных, загруженных из Redshift, или вы можете сохранить данные Redshift в типизированном формате, таком как Parquet, а затем запросить данные.

Полное раскрытие информации: Я являюсь основным хранителем этой библиотеки.

+0

Мы использовали это в первую очередь. 'spark-redshift' использует s3 для передачи данных. Мне было интересно, есть ли способ использовать эту библиотеку, чтобы просто выгрузить все данные навсегда? Позже я обработаю искру. Но это будет в s3. –

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

  • Нет связанных вопросов^_^