Feb 15, 2018

Nike Shoe Dog

本屋でよく見かける「SHOE DOG」を買ってみました。550ページもあるなかなか分厚い本なんですが、1週間も経たないうちに読み終わるぐらいには熱心に読んでしまいました。今まで様々な会社の成り立ちに関する本を読んできました。例えばApple, Amazon, Microsoft, Google, Twitter, Facebook, Tesla, Pixarなどなど。もちろん業界が異なるというものあると思いますが、Nikeの前身となったBlue Ribbon Sportsはメーカーというよりかは商社のようなビジネスで、商習慣や上場に対する考え方なども今まで読んだ会社とは違うなぁと感じました。よくレビューでPhil Knightの性格が悪すぎる!というものを見かけるんですが、人を貶めるようなことはしていないので、子ども心を忘れていないがためにそういう印象を与えているように思えました。
小ネタも多く散りばめられていて、思わずクスッとしてしまう場面が数多くあります。個人的には好きだったのが、中国で模造品が売られていることに気づいたPhil Knightがなぜ無駄にクオリティが高いことに怒りながらも、模造していた人にNikeの靴の製造に携われないかと誘っているところです。

ちなみにオニツカ社のキタミという敵役が出てくるのですが、The Man in the High Castleの木戸で脳内再生されました。

Feb 3, 2018

Aster with run_on_teradata

Have you ever used load_to_teradata function from aster instance? If so, I guess you wonder why we need to drop&create table to load records everytime and think what a drug. The reason is that the function is using Fastload but most engineers are lazy. At least I don’t want to create new connection in this case. By the way, Aster On Hadoop has run_on_hive function which can execute any query on hive side.
So, I developed run_on_teradata SQL-MR UDF. Here is my repository.
https://github.com/ebyhr/Teradata/tree/master/run_on_teradata

Please feel free to ask me any questions and enjoy Aster and Teradata life 🌸

Feb 1, 2018

Don't Stop The Query

昨日かなり重いクエリを流して帰り、今朝出社してから負荷を確認したところ400本近いクエリが遅延している状況を目の当たりにした私です。月初にやるべきではなかったなぁと反省しております。
さて、Teradataの製品群にAster AppCenterというソフトウェアがあるのですが、この製品はSQLとJavaでクエリの実行やグラフの可視化を行うことができます。 今のところ基本的にはSQLで書き、クエリをダイナミックに書き換えたいときなどはJavaを使っているのですが、とあるプロジェクトでデータがロードされていなかったら処理を失敗させたいという絶妙な要望があがりました。Javaなら簡単にかけますが、そのためだけに使いたいかというとうーん…となる感じですね。ちなみにSQLでもJavaでも1つの入力フォームしかないので、1つ目の処理が正常終了したら次へみたいなレベルの処理をちゃんとやりたい場合にはJavaで書く必要があります。
帰りの電車で反省中に思いついたのが、サブクエリでcountをとってcaseでわざとランタイムエラーを発生させるという方法です。
特別な関数は使わないのでPrestoで試してみました。まずはテーブルの準備。

create table memory.default.log (
  id int,
  log_date date
)
;
insert into memory.default.log values (1, cast('2017-12-31' as date))
;

上の状態でまだロードの終わっていない日付、例えば2018/1/1に以下のクエリを実行すると、サブクエリ内のcntは0になり、case内の条件がtrueになりcastが実行されます。数値ではなく文字をintegerにキャストしようとするのでエラーになることが確認できます。

select
 case when cnt = 0 then cast('record not found' as integer) end c1
from
 (select count(*) as cnt from memory.default.log where log_date = current_date) t
;

ちなみにPrestoだと以下のようなエラーメッセージが出力されます。
Query 20180131_163346_00452_nyghj, FAILED, 1 node
Splits: 41 total, 40 done (97.56%)
0:00 [1 rows, 5B] [4 rows/s, 21B/s]
Query 20180131_163346_00452_nyghj failed: Cannot cast 'record not found' to INT

特殊な方法は使っていないので、ほとんどのRDBMSで適用できるんじゃないかなと思っています。ちゃんとしたジョブでやるのがベストではありますが、こういうトリッキーな方法や考え方はたまに役に立ったりするもんなので残しておきます。
タイトルはDon’t Stop The Music feat.森高千里をもじっているので最後にライブ映像を貼っておきます。みなさまどうぞご覧くださいませ。