1

我們正在從Redshift遷移到Spark。我有一張Redshift表格,需要導出到S3。從S3開始,這將被提供給Apache Spark(EMR)。將數據從Amazon Redshift導出爲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被用於替換布爾爲int
  3. ||是Redshift中的連接運算符
  4. chr用於生成{}字符

這個操作是不一樣快卸剛剛以csv。它需要2-3倍的時間。但是,因爲我們需要做一次,它很好。我卸載了大約1600萬條記錄併成功導入了Spark中的所有記錄。

注意:通過spark解析json不是有效的方法。還有其他格式更快,例如parquet文件,序列文件。所以對於火花來說,這可能不是一條正確的道路。但對於卸載爲JSON,您可以使用此解決方案。

+0

這真棒,幫了我很多!謝謝! – unpairestgood

1

查看spark-redshift庫,該庫旨在允許Apache Spark使用UNLOAD從Redshift進行批量讀取;它會自動管理轉義和模式處理。

您可以直接針對從Redshift加載的數據運行Spark查詢,也可以將Redshift數據保存爲類似Parquet的類型格式,然後查詢該數據。

完全披露:我是該圖書館的主要維護者。

+0

我們先用這個。 'spark-redshift'使用s3傳輸數據。我想知道是否有任何方法可以使用這個庫來卸載所有的數據?稍後我將使用火花進行處理。但它會在S3。 –

相關問題