在 athena 上工作时,数据在 redshift 外部表上显示为空

Posted

技术标签:

【中文标题】在 athena 上工作时,数据在 redshift 外部表上显示为空【英文标题】:data appears as null on redshift external table while working right on athena 【发布时间】:2018-08-30 06:44:29 【问题描述】:

所以我试图在红移光谱上运行以下简单查询:

select * from company.vehicles where vehicle_id is not null

它返回 0 行(表中的所有行都是空的)。但是,当我在 athena 上运行相同的查询时,它可以正常工作并返回结果。尝试了 msck 修复,但 athena 和 redshift 都使用相同的元存储,所以没关系。 我也没有看到任何错误。

文件格式为orc。

创建表查询是:

CREATE EXTERNAL TABLE 'vehicles'(
  'vehicle_id' bigint, 
  'parent_id' bigint, 
  'client_id' bigint, 
  'assets_group' int, 
  'drivers_group' int)
PARTITIONED BY ( 
  'dt' string, 
  'datacenter' string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
  's3://company-rt-data/metadata/out/vehicles/'
TBLPROPERTIES (
  'CrawlerSchemaDeserializerVersion'='1.0', 
  'CrawlerSchemaSerializerVersion'='1.0',  
  'classification'='orc', 
  'compressionType'='none')

有什么想法吗?

【问题讨论】:

【参考方案1】:

您是如何创建外部表的? 对于 Spectrum,您必须显式设置参数以将应视为 null 的内容处理

在 TABLE PROPERTIES 中添加参数 'serialization.null.format'='' 以便所有带有 '' 的列都将被视为 NULL 到您的频谱中的外部表中

**

CREATE EXTERNAL TABLE external_schema.your_table_name(
)
row format delimited
    fields terminated by ','
    stored as textfile 
LOCATION [filelocation]
TABLE PROPERTIES('numRows'='100', 'skip.header.line.count'='1','serialization.null.format'='');

**

或者,您可以在创建将自动识别 NULL 值的外部表时设置 SERDE-PROPERTIES

【讨论】:

您提到的属性仅与文本类型的数据相关。您应该使用它,以防您的文本文件包含您希望光谱读取为空的空字段。但是我的数据类型是 orc - 我添加了创建表查询。我的问题是 redshift 将所有行显示为空,尽管它们确实包含数据。在 athena 上我可以正确查看数据。@theDbGuy 好的。请问文件存储在哪里?是在雅典娜还是频谱目录中 数据存储在s3中,元数据存储在胶水数据目录@theDbGuy 您能否使用主键或其他东西从 athena 中选择一条记录(当您执行 NOT NULL 条件时返回)并尝试在频谱中选择相同的记录并让我知道输出是否匹配 如果可能,尝试使用胶水爬虫创建表,而不是使用CREATE语句【参考方案2】:

最终证明这是红移中的一个错误。为了修复它,我们需要运行以下命令:

ALTER TABLE table_name SET TABLE properties(‘orc.schema.resolution’=‘position’);

【讨论】:

你有关于这个错误的更多细节吗?我有一个类似的问题,虽然它只是一些列没有出现。不过,它们在雅典娜中看起来还不错。 您好@confytoday,您找到解决方案了吗?对我来说也只有一些列是空的,这里没有什么不能解决我的问题

以上是关于在 athena 上工作时,数据在 redshift 外部表上显示为空的主要内容,如果未能解决你的问题,请参考以下文章

Hive/Athena:创建表时忽略字段

AWS Athena 分区获取所有路径

AWS Athena 上的偏移量

如何在 AWS Athena 中转换时区

AWS Athena [Presto] 如何仅接收过去 7 天的数据?

使用CloudFormation模板更新AWS Athena工作组