rkj*_*rkj 5 hive amazon-s3 amazon-web-services amazon-redshift
我的S3文件(s3://MY_s3/stage/my_s3_file)在以下位置具有分区load_dt:
S3结构:
-MY_S3
--stage
---my_s3_file
----load_dt=2016-02-01
----000024
----load_dt=2016-02-02
----000036
Run Code Online (Sandbox Code Playgroud)
实际文件位于load_dt分区下,例如000024&000036。
如果我不在Redshift表中保留load_dt,则COPY命令可以正常工作,但是当我在Redshift表中添加load_dt时,COPY命令由于数据错误而失败,因为输入布局和目标布局不匹配(目标上有额外的load_dt)。
创建S3文件的配置单元表的末尾显示了分区的load_dt。
如何使此COPY命令与目标Redshift上的load_dt一起使用?
我什至尝试将S3位置更改为s3://MY_s3/stage/my_s3_file/load_dt无运气。
当 Hive(在 Apache Hadoop 下运行)创建分区时EXTERNAL TABLE,它会按目录分隔文件。例如,所有行都load_dt=2016-02-01存储在名为load_dt=2016-02-01.
目录中的文件不存储分区列 ( load_dt) 的值。相反,分区列的值存储为目录名称的一部分。因此,重命名目录实际上会更改目录中所有行的该列中的值。
是的,这有点奇怪,但这就是 Hive 存储其数据的方式!
Amazon Redshift 可以从 Amazon S3 导入 CSV 文件(包括压缩的 CSV 文件)。它甚至可以从多个子目录导入文件,因为它只查看要加载的文件的路径前缀。但是,它不了解 Hive 存储分区数据的方式,因此它不会从目录 name 加载分区列。
一些选项:
COPY根据某些计算(例如,从日期字段)设置列值之后运行命令我想我找到了我的案例的答案。
我无法加载 Hive 分区,因为 Hive 将该分区值存储在 Hive 元数据中,这就是 S3 文件中不存在分区列的原因。
现在,我通过 Hive 将一个新列添加到 S3 作为 Load_Dt_New,以便 S3 文件将具有 Redshift COPY 命令正常工作所需的列。
| 归档时间: |
|
| 查看次数: |
1644 次 |
| 最近记录: |