amazon-web-services - 将数据从 Amazon Redshift 导出为 JSON

标签 amazon-web-services apache-spark amazon-s3 mapreduce amazon-redshift

我们正在从 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/

    相关文章:

    ruby-on-rails - 使用 Ruby 在 Mechanical Turk 上创建新任务的简单方法?

    python - Spark结构化流: parquet partition name uniqueness

    java - 第三方以编程方式拥有的 Amazon S3 存储桶数据下载

    excel - 有人使用 Redshift 获取 Excel 数据透视表吗?

    node.js - 为什么我的 lambda 函数没有按预期工作?

    php - 503 表单提交时服务不可用

    python - 将逗号分隔的字符串转换为 pyspark 数据框中的数组

    python - PySpark:将 python 列表中的元素添加到 spark.sql() 语句中

    Android AWS TransferService 不适用于 API 级别 26 及更高级别

    python - 使用 Django Uploadify S3 接收 HTTP 错误