TreasureDataと文字化け


文字化けに遭遇

突然ですが、Treasure Data(以下TD)でPrestoクエリを実行したら文字化けしてしまっていた、なんてことありませんか?

そもそも文字化けって

文字化けというと、UTF-8のファイルをShift-jisとして開いてしまったときに発生するイメージを持っているかと思います。
テキストエディタで文字コードを指定して開いてみます。

# UTF-8で開いた場合
col1,col2,col3
テスト1,テスト2,テスト3
# Shift-jisで開いた場合
col1,col2,col3
繝�繧ケ繝茨シ�,繝�繧ケ繝茨シ�,繝�繧ケ繝茨シ�

想定通り文字化けしていますね。
これと同じことがTDへデータインポートする際に発生しているのです。

Treasure Data の文字コード

TDはUTF-8でデータを保持しています。
そのため、例えばShift-jisのcsvファイルをTDへアップロードする場合は「Shift-jisのデータが対象だよ」と教えてあげる必要があり、正しく設定していればデータアップロード時にUTF-8へ自動変換してくれます。

意図的に文字化けを発生させてみる

UTF-8のファイルをアップロードして文字化けを発生させてみましょう。

TDコンソール(ブラウザ)でアップロードする場合、Advanced Settingsから文字コードを指定することができます。

UTF-8のファイルなのですが、あえてShift-JISと設定してみます。

すると先述のようにプレビュー時点で文字化けしてしまっています。もちろんこのままアップロードするとプレビュー通り文字化けした状態で格納されます。

TDで文字化けが発生してしまったら

先述したように文字化けした状態でTDへデータをアップロードしてしまうと、文字コードは当然UTF-8なのですが、間違った文字が格納されている状態になっています。無理やり解釈した結果が入っているわけです。

事後対応としては対象レコードをDELETEしてから、正しくデータ投入し直す必要があります。
プレビューで確認してからデータアップロードできればよいのですが、業務の中で毎回プレビューを表示しチェックするのはなかなか難しいかと思います。

事前に十分なテストを実施し、文字化けが発生しないようにしましょう。

ダウンロード結果のみが文字化けしている場合

TDコンソールにてPresto/Hiveクエリを実行すると結果をダウンロードすることができます。
現時点では文字コードがUTF-8の一択なので、ダウンロードしたファイルをShift-jisとして開いてしまい文字化けしているように見えてしまうことが考えられます。
その場合は、TD上では正しくデータが格納されているので、どの文字コードとして処理しているのか、落ち着いて整理してみてください。