[アップデート] CloudFront 標準ログにパーティショニング設定で Hive 形式の時でもディストリビューション ID がパーティションキーに使えるようになりました
いわさです。
昨年末のアップデートで CloudFront 標準ログがパーティショニングをサポートしました。従来悩みがちだったので嬉しい方も多かったと思います。
オプションとして Hive 互換形式を選択することが出来ます。
Hive 形式を使うことでMSCK REPAIR TABLE
でパーティションの自動認識ができるようになります。
今まであまり問題になるケースはなかったのですが、実はこのパーティション変数でDistibutionId
を使うと、キー名がキャメル(パスカル)ケースで出力され、パーティションのロードに失敗します。
おそらく先日の CloudFront のマルチテナント対応で、ディストリビューションもパーティションに含めるユースケースが出てきたので発覚したのだと思います。
これが少し前に、パーティショニング変数でdistributionid
というのも使えるようになりました。
これで Hive 形式の場合の問題も解消できるようになりそうです。試してみましょう。
従来の DistibutionId
まずは従来のDistibutionId
から使ってみます。
パーティショニングを次のように設定し、Hive 互換形式を有効化します。
しばらく待って S3 に出力されたログを見てみると、たしかにDistributionId
が大文字含んでいますね。気づかなかったな。変数MM
はmonth
に変換されています。
Athena で次のようにテーブルを作成しました。
CREATE EXTERNAL TABLE hoge0513hive1 (
`date` STRING,
`time` STRING,
`c-ip` STRING
)
PARTITIONED BY (
`DistributionId` STRING,
`year` STRING,
`month` STRING,
`day` STRING,
`hour` STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://hoge0513hive1/AWSLogs/aws-account-id=123456789012/CloudFront/';
MSCK REPAIR TABLE
してみると、DistributionId
のロードに失敗していますね。
公式ドキュメントにも次のように記載されており、小文字にする必要がありそうです。
Amazon S3 オブジェクトキーの大文字と小文字の区別 – Amazon S3 パスがキャメルケースではなく小文字になっている (例: userId ではなく userid) ことを確認するか、ALTER TABLE ADD PARTITION を使用してオブジェクトキー名を指定します。
MSCK REPAIR TABLE - Amazon Athena
新しく追加された distribtuionid を使ってみる
では先ほどのログ設定を変更しDistributionId
をdistributionid
に変更してみましょう。
出力されたキーを確認してみると小文字になっていますね。なるほど。
ちなみに、CloudFront 標準ログのパーティショニングフィールドでは、許可された変数以外は設定出来ません。次のようにエラーになります。
今まではdistributionid
も使えなかったのだろうと思いますが、これがサポートされた感じですね。
同じようにテーブルを作成してMSCK REPAIR TABLE
してみるとパーティションを発見し自動でメタストアに追加してくれました。
先ほどは失敗していましたが、レコードの読み込みも出来るようになりましたね。
さいごに
本日は CloudFront 標準ログにパーティショニング設定で Hive 形式の時でもディストリビューション ID がパーティションキーに使えるようになったので使ってみました。
今までは複数ディストリビューションをまとめて管理することも少なかったので、Hive 形式の場合でもパーティションキーに指定しなくても良かったと思うのですが、特にマルチテナントディストリビューションを使う場合はディストリビューションをパーティションキーに使いたいことも増えると思いますので、今回の方法を覚えておくと良さそうです。