TreasureDataでカラム名に大文字が入ってしまった場合のメモ


Treasure Dataで、テーブルへのスキーマ設定の際に、カラム名に大文字が入っていると現状では設定できない。

Schemas currently support column names consisting of lowercase alphabets, numbers, and "_" only.
http://docs.treasuredata.com/articles/schema#setting-custom-schema

現状は、データの入れ直しをする必要があるので、全データの入れ直しの手順をメモする。

まず、該当するテーブルに対して、クエリを発行する。

sql
SELECT
*
FROM
(TABLE)
LIMIT 1

上記を実行すると、vカラムの全データとtimeが1行出力される。
v:map time:int

クエリの実行結果をjson形式でダウンロードし、エディタで開く。

sql
["v","time"]
[{"id":"hi","time":"1334102460"},1334102460]

上記からスクリプト用にいらんとこを消しておく。

sql
{"id":"hi","time":"1334102460"}

スクリプトの(jobid)とtablenameを環境に合わせて書き換えて、スクリプトを実行し、標準出力をWebコンソールにコピペする。

ruby
# encoding: utf-8
require 'json'

header = JSON.parse(File.read("~.json", :encoding=>"UTF-8"))
db = "dbname"
table = "tablename"
cnt = 0
puts "-- #{db}.#{table}"
puts "SELECT "
header.each_key do |key|
  cnt += 1
  puts "v['#{key}'] AS #{key.downcase},"  if key != 'time' and cnt != header.length
  puts "v['#{key}'] AS #{key.downcase}"   if key != 'time' and cnt == header.length
  puts "#{key} AS #{key.downcase},"       if key == 'time' and cnt != header.length
  puts "#{key} AS #{key.downcase}"        if key == 'time' and cnt == header.length
end
puts "FROM #{table}"


実行時の結果出力先にTreasureDataを選び、空のテーブルに出力する。

最後にローカルのtdコマンドのswapを実行するとテーブル名の入れ替えができる。

$ td table:swap <db> <スキーマに大文字があるテーブル> <先ほどの結果を出力したテーブル>

Treasure DataについてにRelease Notesが見れるようになりましたね。
http://help.treasuredata.com/customer/portal/topics/624353-release-notes/articles

以上。