为什么AWS Athena会在“显示创建表”命令或描述表中向所有表的字段返回“字符串”数据类型

时间:2019-06-30 08:41:06

标签: presto amazon-athena

为什么AWS Athena会将“字符串”数据类型返回到上所有表的字段 “显示创建表”命令或描述表: 例如表t_mus_albums

albumid (bigint)
title (string)
artistid (bigint)

跑步 show create table t_mus_albums; 我得到:

CREATE EXTERNAL TABLE `t_mus_albums`(
  `albumid` string COMMENT 'from deserializer', 
  `title` string COMMENT 'from deserializer', 
  `artistid` string COMMENT 'from deserializer')

2 个答案:

答案 0 :(得分:0)

我认为您可能做错了什么,或者在自动生成表时,可能没有正确的格式化数据。

以下是解决您的问题的系统步骤。 假设您的数据采用以下格式。

ID,Code,City,State
41,5,"Youngstown", OH
42,52,"Yankton", SD
46,35,"Yakima", WA
42,16,"Worcester", MA
43,37,"Wisconsin Dells", WI
36,5,"Winston-Salem", NC

然后您的创建表将如下所示。

CREATE EXTERNAL TABLE IF NOT EXISTS example.tbl_datatype (
  `id` int,
  `code` int,
  `city` string,
  `state` string 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
) LOCATION 's3://example-bucket/location/a/'
TBLPROPERTIES ('has_encrypted_data'='false');

然后,运行查询以描述表。

SHOW CREATE TABLE tbl_datatype;

它将为您输出如下内容。

CREATE EXTERNAL TABLE `tbl_datatype`(
  `id` int, 
  `code` int, 
  `city` string, 
  `state` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://example-bucket/location/a/';

希望有帮助!

答案 1 :(得分:0)

这是因为您使用的是CSV SERDE,而不是TEXT Serde。 CSV serde仅支持string数据类型,因此所有列均为该类型。

来自https://docs.aws.amazon.com/athena/latest/ug/csv.html

  

OpenCSV SerDe [...]将所有列类型值转换为STRING。

文档概述了一些条件,在这些条件下,表模式可能与所有string不同(例如,“ ,它会在可以时将值解析为BOOLEAN,BIGINT,INT和DOUBLE数据类型。识别它们”),但显然这对您而言无效。