HiveのSERDEPROPERTIESはパーティション単位でも変更できる
アプリのログなんかを正規表現使ってHiveにぶっ込む場合には以下のようにします。
CREATE TABLE hoge ( hostname string, ... ) PARTITIONED BY ( ymd STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'input.regex'='...' )
hive-contrib-xxx.jarをadd jarするのを忘れずに。
で、あるとき、ログのフォーマットが変わってそのままHiveからselectするとNULLばっかになったとします。
例えば20140110から変わって20140115までのパーティションがあるとしましょう。
で、20140116に気づいて、新旧両方のログフォーマットに対応した正規表現を使って下記のようにSERDEPROPERTIESを変更しても20140110のデータはやっぱりNULLになったりします。
ALTER TABLE hoge SET SERDEPROPERTIES("input.regex"= "...")
ただし変更後に新しく作られるパーティション、例えば20140116に関しては大丈夫です。
どうもパーティション単位でも情報持っているらしく古いパーティションに対しては下記のように変更したらうまくいきました。
ALTER TABLE hoge partition(ymd="20140110") SET SERDEPROPERTIES("input.regex"= "…")
パーティション単位での変更後のinput.regexはこんな感じで確認できます。
desc formatted hoge partition(ymd="20140110")