我们正在从 Redshift 迁移到 Spark。我在 Redshift 中有一个表,需要导出到 S3。从 S3,这将被馈送到 Apache Spark (EMR)。
我发现只有一种方法可以从 Redshift 导出数据。那就是 UNLOAD
命令。并且卸载不能导出类型化数据。它导出 csv,这是一个字符串表。基于不同的格式(引号、分隔符等),Spark 似乎不能很好地识别它。所以我正在寻找一种方法来卸载它们并确保它们被正确类型的 Spark 读取。
有什么方法可以将数据卸载为 JSON 或 Spark 可识别的其他类型格式?
最佳答案
最后我用字符串连接手动构建了 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
用于将 bool 值替换为 int ||
是 Redshift 中的连接运算符 chr
用于生成{
和 }
人物这个操作不像 csv 只是卸载那么快。这将需要 2-3 倍的时间。但是因为我们需要做一次,它很好。我卸载了大约 16 亿条记录并成功地将它们全部导入到 Spark 中。
备注 : 通过 spark 解析 json 不是有效的方法。还有其他更快的格式,如 Parquet 文件、序列文件。所以对于 spark,这可能不是一条正确的道路。但是对于卸载为 JSON,您可以使用此解决方案。
关于amazon-web-services - 将数据从 Amazon Redshift 导出为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40237510/