使用Redshift Spectrum读取AWS Redshift中外部表中的数据

时间:2019-03-28 19:19:14

标签: amazon-redshift amazon-redshift-spectrum

我在AWS Redshift集群中进行了以下操作,以从S3中读取Parquet文件。

create external schema s3_external_schema 
from data catalog 
database 'dev' 
iam_role 'arn:aws:iam::<MyuniqueId>:role/<MyUniqueRole>'
create external database if not exists;

然后

CREATE external table s3_external_schema.SUPPLIER_PARQ_1 (
S_SuppKey BIGINT ,
S_Name varchar(64) ,
S_Address varchar(64) ,
S_NationKey int ,
S_Phone varchar(18) ,
S_AcctBal decimal(13, 2) ,
S_Comment varchar(105))
partitioned by (Supplier bigint, nation int)
stored as PARQUET
location 's3://<My Bucket>/<File partition>/';

以上两个create语句均成功。当运行以下查询时,它返回0。

select * from s3_external_schema."supplier_parq_1"
limit 10;

No rows returned.

我是否缺少任何授予或访问权限,以使其返回查询输出。

2 个答案:

答案 0 :(得分:1)

调试无效的Redshift-Spectrum查询的步骤

  1. 使用雅典娜尝试相同的查询:最简单的方法是运行粘合爬虫 针对s3文件夹,它应该创建一个配置单元metastore表,该表 您可以直接查询(使用与您已经使用的相同的sql) 雅典娜。
  2. 使用s3 select:使用aws控制台导航到您的实木复合地板之一 文件,右键单击并“选择”,然后单击镶木地板(可能已经 默认值),然后看看您得到什么。

如果1.或2.在工作,则可能是您的定义在光谱上不正确。而是只使用在配置单元metastore中创建的定义,就像这样。

create external schema some_schema from data catalog
database 'the_name_you_gave_the_hive_db'
iam_role 'whatever'
create external database if not exists;

然后,您可以使用新定义的红移频谱模式而无需进一步定义。

答案 1 :(得分:0)

除了乔恩·斯科特(Jon Scott)所说的那样,如果使用分区创建了一个外部表,除非运行ALTER TABLE来添加分区,否则将不会显示任何数据

创建表并添加后续分区后需要运行的是

ALTER TABLE s3_external_schema.SUPPLIER_PARQ_1 ADD PARTITION ('...')
LOCATION 's3://<My Bucket>/<File partition>/'

要检查外部表查询的错误消息,应使用SVL_S3LOG表。