LoginSignup
0
0

More than 1 year has passed since last update.

filename-yyyymmddの形式で退避したS3をAthenaで日付条件クエリ

Last updated at Posted at 2021-07-26

はじめに

OSのログをS3へ退避する際、
とりあえず貯めとけ精神でOS上でログローテされたまま保存しますよね。

そうすると後々、
ある月のログに対してAthenaでクエリかけたい...ってときに苦しみますよね。

でもHive形式に作り替えるのも面倒ですよね。
※Athenaでのパーティション分割:https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partitions.html

そんなときは、検索に時間かけても良いからゴリ押しでクエリをかけましょう。

#0. S3の構造

  • バケットURL:s3://secure-log-athena-test/secure/
  • オブジェクト:

secure
secure-20210701
secure-20210702
secure-20210703
secure-20210704
secure-20210705
secure-20210706
secure-20210707
・・・

#1. サンプルDDL

  • テーブル名, 'バケット名URI' 部分は各S3バケットのURIに置き換えてください。
CREATE EXTERNAL TABLE `テーブル名`(
  `month` string COMMENT '',
  `day` string COMMENT '',
  `time` string COMMENT '',
  `host` string COMMENT '',
  `cmd` string COMMENT '',
  `user` string COMMENT '',
  `etc` string COMMENT '')
ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  'input.regex'='^(\\S+) +(\\S+) +(\\S+) +(\\S+) +(\\S+) +(\\S+) +(.+)$')
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'バケット名URI'
TBLPROPERTIES (
  'has_encrypted_data'='false',
  'transient_lastDdlTime'='1622793925')

2. クエリ

  • "DB名", "テーブル名" 部分は各S3バケットのURIに置き換えてください。
SELECT *
FROM "DB名"."テーブル名"
WHERE "$path" LIKE '%secure-202107%'
        AND cmd LIKE '%sudo%'
        AND user NOT LIKE '%pam_unix%'; 

おわりに

・運用等で定期的に検索をかける必要がある
・クエリに時間をかけたくない(お金もかけたくない)
そんなときは腹を括ってS3の構造と退避スクリプトに向き合いましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0