Shi*_*dim 6 mapreduce amazon-s3 amazon-web-services amazon-redshift apache-spark
我们正在从Redshift迁移到Spark.我在Redshift中有一个表,我需要导出到S3.从S3开始,这将被提供给Apache Spark(EMR).
我发现只有一种方法可以从Redshift导出数据.这就是UNLOAD命令.并且卸载无法导出类型化数据.它导出csv,这是一个字符串表.基于不同的格式(引用,分隔符等),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'
;
Run Code Online (Sandbox Code Playgroud)
这里,
nvl function用于替换nullconvert 用于将布尔值替换为int|| 是Redshift中的连接运算符chr用于生成{和}字符此操作没有像csv那样快速卸载.它需要2-3倍的时间.但是,由于我们需要做一次,它很好.我卸载了大约1600万条记录,并成功地在Spark中导入了所有记录.
注意:用spark解析json不是有效的方法.还有其他更快的格式,如镶木地板文件,序列文件.所以对于火花来说,这可能不是一条正确的道路.但是对于卸载为JSON,您可以使用此解决方案.
| 归档时间: |
|
| 查看次数: |
3266 次 |
| 最近记录: |