イクジニアブログ

育児 + エンジニア = イクジニア

CDH5.4 Hiveでのカラムずれ問題

ビールはキリン党のにいやんです。こんばんわ。

一番搾りが好きですが、プリン体がラガーの方が少ないと聞き、ラガーに浮気しようかと・・・

さてさて、先日CDH5.4のアップデート方法を書いて、特に問題なかったぜ!って思ったのですが。 後から大問題が確認されました。。。

なんとHiveのバグを思いっきり踏んでいたらしく、selectした際のカラムずれが起きてました...orz

バグは以下のチケットにあがっています。

[HIVE-9613] Left join query plan outputs wrong column when using subquery - ASF JIRA

どのようなバグかざっくりいうと、
「left outer joinを繰り返すと、select したのと違うカラムが表示される場合がある」
という、なんとも悲惨なバグです。

すでにチケットはクローズされ、Hive1.2では修正されているようなのですが、CDH5.4.2ではbackportされていないようで、バグが出てしまうようです。

回避策としてはleft outer join をする度に別名をつけると回避できるようです。

バグが出るSQL(バグのチケットより抜粋)

select
    a.category,
    a.city,
    a.rank,
    b.src_category_en,
    c.src_city_name_en
from
    hivetemp.category_city_rank a
left outer join
(select
    src_category_en,
    dst_category_en
from
    hivetemp.category_match) b
on  a.category = b.dst_category_en
left outer join
(select
    src_city_name_en,
    dst_city_name_en
from
    hivetemp.city_match) c
on  a.city = c.dst_city_name_en

以下のように修正することで回避

select
    aa.category,
    aa.city,
    aa.rank,
    aa.src_category_en,
    c.src_city_name_en
from
(
select
    a.category,
    a.city,
    a.rank,
    b.src_category_en
from
    hivetemp.category_city_rank a
left outer join
(select
    src_category_en,
    dst_category_en
from
    hivetemp.category_match) b
on  a.category = b.dst_category_en
) aa
left outer join
(select
    src_city_name_en,
    dst_city_name_en
from
    hivetemp.city_match) c
on  aa.city = c.dst_city_name_en

CDHでも早めにバグが修正されるとよいですね。