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

この記事は公開されてから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から本格的に相互参照できるようになります。今回のヘッダ行のスキップがサポートされることによって、これらのサービスから同じデータを参照できるようになりました。アクセス特性や目的に応じてデータレイクをご活用ください。