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")