Avro SerDe
使用 Avro SerDe 从 Avro 数据中创建 Athena 表。
序列化库名称
Avro SerDe 的序列化库名称是 org.apache.hadoop.hive.serde2.avro.AvroSerDe。有关技术信息,请参阅 Apache 文档中的 AvroSerDe
使用 Avro SerDe
出于安全原因,Athena 不支持使用 avro.schema.url 指定表架构;改为使用 avro.schema.literal。
要从 Avro 格式的数据中提取架构,请使用位于已安装的 Avro 版本的 java 子目录中的 Apache avro-tools- 文件。使用 <version>.jargetschema 参数返回可在 WITH SERDEPROPERTIES 语句中使用的架构,如以下示例所示。
java -jar avro-tools-1.8.2.jar getschema my_data.avro
要下载 Avro,请参阅 Apache Avro 版本
获取架构后,请使用 CREATE TABLE 语句根据 Amazon S3 中存储的底层 Avro 数据创建一个 Athena 表。要在您的 CREATE TABLE 语句中指定 Avro SerDe,请使用 ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.avro.AvroSerDe'。使用 WITH SERDEPROPERTIES 子句指定架构,如以下示例所示。
注意
在 s3://athena-examples- 中,将 myregion/path/to/data/myregion 替换为您运行 Athena 所在的区域标识符,例如 s3://athena-examples-us-west-1/path/to/data/。
CREATE EXTERNAL TABLE flights_avro_example ( yr INT, flightdate STRING, uniquecarrier STRING, airlineid INT, carrier STRING, flightnum STRING, origin STRING, dest STRING, depdelay INT, carrierdelay INT, weatherdelay INT ) PARTITIONED BY (year STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' WITH SERDEPROPERTIES ('avro.schema.literal'=' { "type" : "record", "name" : "flights_avro_subset", "namespace" : "default", "fields" : [ { "name" : "yr", "type" : [ "null", "int" ], "default" : null }, { "name" : "flightdate", "type" : [ "null", "string" ], "default" : null }, { "name" : "uniquecarrier", "type" : [ "null", "string" ], "default" : null }, { "name" : "airlineid", "type" : [ "null", "int" ], "default" : null }, { "name" : "carrier", "type" : [ "null", "string" ], "default" : null }, { "name" : "flightnum", "type" : [ "null", "string" ], "default" : null }, { "name" : "origin", "type" : [ "null", "string" ], "default" : null }, { "name" : "dest", "type" : [ "null", "string" ], "default" : null }, { "name" : "depdelay", "type" : [ "null", "int" ], "default" : null }, { "name" : "carrierdelay", "type" : [ "null", "int" ], "default" : null }, { "name" : "weatherdelay", "type" : [ "null", "int" ], "default" : null } ] } ') STORED AS AVRO LOCATION 's3://athena-examples-myregion/flight/avro/';
在该表上运行 MSCK REPAIR TABLE 语句以刷新分区元数据。
MSCK REPAIR TABLE flights_avro_example;
按照出发总数查询前 10 个出发城市。
SELECT origin, count(*) AS total_departures FROM flights_avro_example WHERE year >= '2000' GROUP BY origin ORDER BY total_departures DESC LIMIT 10;