AWS Athena能否为列设置别名?无需创建两张表
解决AWS Athena Avro表列别名查询的方案
不用创建两张表的话,有几个实用的方法可以实现同时用原列名和别名查询,我给你详细说说:
方法1:创建视图(推荐,复用性高)
视图是虚拟表,不会复制数据,你可以在视图里同时保留原列名和别名,这样查询视图时两种名称都能用。
先确保你的原表已经创建好,然后执行下面的SQL创建视图:
CREATE VIEW my_table_aliased AS SELECT name, name AS personName, address, address AS personAddress, phone, phone AS personPhone -- 其他列同理 FROM your_original_avro_table;
之后查询这个视图时,不管写name还是personName都能拿到对应的数据,完美满足你的需求。
方法2:查询时直接指定别名(临时场景适用)
如果只是偶尔需要用别名,不用额外创建对象,每次查询时直接在SELECT语句里定义别名就行:
SELECT name, name AS personName, address, address AS personAddress, phone, phone AS personPhone FROM your_original_avro_table;
这种方式灵活,但每次查询都要写一遍别名,适合临时查询的场景。
方法3:利用Avro Schema的别名特性(底层支持)
Avro格式本身支持给字段定义别名,你可以在Avro Schema里为每个字段添加aliases属性,这样Athena读取时会自动识别这些别名,直接用别名查询原表。
比如修改你的Avro Schema,给name字段加上别名:
{ "type": "record", "name": "Person", "fields": [ {"name": "name", "type": "string", "aliases": ["personName"]}, {"name": "address", "type": "string", "aliases": ["personAddress"]}, {"name": "phone", "type": "string", "aliases": ["personPhone"]} // 其他字段同理 ] }
然后创建外部表时,指定这个带别名的Avro Schema(如果已经创建了表,可能需要重新定义表来关联新的Schema):
CREATE EXTERNAL TABLE IF NOT EXISTS your_original_avro_table ( name STRING, address STRING, phone STRING -- 其他列 ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' WITH SERDEPROPERTIES ( 'avro.schema.literal' = '{ "type": "record", "name": "Person", "fields": [ {"name": "name", "type": "string", "aliases": ["personName"]}, {"name": "address", "type": "string", "aliases": ["personAddress"]}, {"name": "phone", "type": "string", "aliases": ["personPhone"]} ] }' ) LOCATION 's3://your-bucket/path/';
这样原表本身就支持用name或personName查询,不需要额外的视图或重复定义。
内容的提问来源于stack exchange,提问作者DJ180
相关产品推荐
相关产品推荐

