将amazon redshift中的数据导出为json

zaqlnxep  于 2021-05-27  发布在  Spark
关注(0)|答案(3)|浏览(551)

我们正在从红移移到星火。我有一个红移的表需要导出到s3。从s3,这将被馈送到apachespark(emr)。
我发现只有一种方法可以从红移中导出数据。那就是 UNLOAD 命令。卸载不能导出类型化数据。它导出csv,csv是一个字符串表。基于不同的格式(引号、分隔符等),spark似乎不能很好地识别它。所以我正在寻找一种方法来卸载它们,并确保它们是由spark以正确的类型读取的。
有没有什么方法可以将数据作为json或其他类型化格式卸载到spark中?

8gsdolmq

8gsdolmq1#

最后我用字符串连接手动构建了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 用于将布尔值替换为int || 是红移中的连接运算符 chr 用于生成 { 以及 } 性格
这个操作不如csv卸载那么快。这需要2-3倍的时间。但我们需要做一次,这很好。我卸载了大约16亿条记录,并在spark中成功导入了所有这些记录。
注意:通过spark解析json不是有效的方法。还有其他更快的格式,如Parquet文件,序列文件。所以对于spark来说,这可能不是一条正确的道路。但是对于作为json卸载,您可以使用这个解决方案。

11dmarpk

11dmarpk2#

因为redshift是基于postgresql的rdbms;提取到json可能不是一种简单的方法。在运行unload命令(输出“csv”)之后,可以将该csv转换为json格式
以下是github项目:https://github.com/darwin/csv2json
如果需要基于命令的工具:https://www.npmjs.com/package/csvtojson

qcuzuvrc

qcuzuvrc3#

查看 spark-redshift 库,它的设计允许apachespark使用 UNLOAD ; 它自动管理转义和模式处理。
您可以直接对从redshift加载的数据运行spark查询,也可以将redshift数据保存为类型化格式(如parquet),然后查询该数据。
完全公开:我是那个库的主要维护者。

相关问题