Amazon Athenaがヘッダ行のスキップをサポートしました!

2018.01.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Amazon Athenaがついにヘッダ行のスキップ(skip.header.line.count プロパティ)をサポートしました。AthenaのクエリエンジンPrestoは、読み込ませない行を指定できない仕様でした。Redshift SpectrumやGlue(Spark)は、skip.header.line.count プロパティをサポートしていましたが、Athenaのみが未サポートでした。非常に影響の大きい機能追加なので紹介します。

下記の通り、従来は「読み込ませない行を指定できない」仕様でした。

この制約は、Presto 自体が Hive の上記オプションに対応していないことに起因しています。

skip.header.line.count プロパティの指定方法

skip.header.line.count プロパティは、データファイルの先頭から読みこまない行数を指定する設定です。例えば、データファイルの先頭行にカラム名がある場合、データは2行目以降になります。

skip.header.line.countは、下記のHive DDLの行目のように読み飛ばしたい(Skipしたい)行数を'skip.header.line.count'='1'のように指定します。

CREATE EXTERNAL TABLE `orders_jp_skip_1`(
`row id` bigint,
`order id` string,
`order date` string,
`ship date` string,
`ship mode` string,
`customer id` string,
`customer name` string,
`segment` string,
`country` string,
`city` string,
`state` string,
`region` string,
`product id` string,
`category` string,
`sub-category` string,
`product name` string,
`sales` double,
`quantity` bigint,
`discount` double)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://mybucket/orders_jp'
TBLPROPERTIES (
'CrawlerSchemaDeserializerVersion'='1.0',
'CrawlerSchemaSerializerVersion'='1.0',
'UPDATED_BY_CRAWLER'='orders_jp',
'averageRecordSize'='215',
'classification'='csv',
'columnsOrdered'='true',
'compressionType'='none',
'delimiter'='\t',
'objectCount'='1',
'recordCount'='10766',
'sizeKey'='2314879',
'skip.header.line.count'='1',
'transient_lastDdlTime'='1516172842',
'typeOfData'='file')

上記の定義をすることで、先頭行が読み飛ばされ2行目以降がデータとして認識されます。

もし、'skip.header.line.count'='1'を指定しないと、以下のようにデータにカラム名が表示されてしまいます。

最後に

Glueデータカタログは、S3のファイルに対するテーブル定義のメタストアです。このメタストアにHive DDL形式で定義することで、Amazon Redshift、Amazon Athena、Amazon EMR、AWS Glueから本格的に相互参照できるようになります。今回のヘッダ行のスキップがサポートされることによって、これらのサービスから同じデータを参照できるようになりました。アクセス特性や目的に応じてデータレイクをご活用ください。