Skip to main content

Posts

Teradata XMLAGG

SQLServerやPostgreSQLにあるstring_aggやMySQLのgroup_concatですが残念なことにTeradataでは存在しません。代わりにという訳ではないですが、 xmlagg という集約関数があり、これを使うと同じようなことが実現できます。 まずはデータを準備します。 drop table test_xml_agg ; create table test_xml_agg (  c1 int ,c2 int ,c3 varchar(10) ) ; insert into test_xml_agg values (1,1,'hello'); insert into test_xml_agg values (1,2,'world'); insert into test_xml_agg values (2,1,'this'); insert into test_xml_agg values (2,2,'is'); insert into test_xml_agg values (2,3,'xmlagg'); 上記のデータを1列目で集約し、2列目の順番で一度3列目を横に展開しカンマで結合するというクエリを書いてみます。 select  c1    ,trim(trailing ',' from xmlagg (c3 || ',' order by c2) (varchar(100))) as string_agg from test_xml_agg group by 1 ; Result Set c1 string_agg 1  hello, world 2  this, is, xmlagg string_aggに比べるとごちゃちゃしていますが、まず xmlagg(c3 || ',' order by c2) で2列目の昇順で3列目を結合していくことを表しています。続いて (varchar(100)) で型をsysudtlib.xmlからvarcharにキャストし、最後に末尾のカンマを除いています。 2018/10/19追記 tdstats.udfco...

Short circuit on Teradata

My colleague found that some queries on Teradata are improved by  Short-circuit evaluation . This is common knowledge among software engineers, but DBA may not know it. I knew it short circuit, but I didn't know it is effective to sql. For example, following query seems not bad and you may think everything is ok. (Please forget 'like any' since it is rewritten internally) SELECT  * FROM t1 WHERE  c1 LIKE '%a0001%' OR  c1  LIKE  '%a0002%' OR  c1  LIKE  %a0003%' ... OR c1  LIKE  '%a9999%' ; By using short circuit, this query can be rewritten like this.  SELECT  * FROM t1 WHERE  c1  LIKE  '%a%' and  (  c1  LIKE  '%a0001%'  OR c1  LIKE  '%a0002%'   OR  c1  LIKE  '%a0003%'  ...   OR  c1  LIKE  '%a9999%' ) ; Of course, this rewrite isn't effective for all situations. It depends on the data character...

Facility Dog Bailey

去年の年末に会社で開催された シャイン・オン!キッズ の ビーズ・オブ・カレッジ というプログラムに参加してきました。詳しくはリンク先に書いてありますが、会社のプログラムでは参加者が腕にまく組紐ブレスレットにビーズを通したものと手書きのクリスマスカードを送りました。写真がなくて伝わらないですが、ブレスレットもビーズも手作りと聞いて驚きました。どちらもカラフルな綺麗な色でむしろ自分も欲しいぐらいでした。 さらに、「 ベイリーとさっちゃん 」という絵本も買って読んでみました。絵本なので子ども向けではありますが、ファシリティドッグについて知らない人は大人でもまだまだ多いと思うので、少しでも読んでくれる人がいるといいなぁと思っています。 こういった活動を年に1度しかやらないのはもったいないということで、毎月の募金にも少額ではありますが登録してみました。興味のある方はぜひに🐶 シャイン・オン!キッズへ寄付していただく方法 また、今度の2/14(水)〜2/18(日)に ファシリティドッグ写真展2018 というイベントが東京国際フォーラムで開催されるようです。僕は日曜日に参加する予定です!

Trino parser introduction

Trinoのパーサー部分では ANTLR が使われています。 ファイルは以下のパスにあります。パーサー系で追加したり修正する場合はまず SqlBase.g4 を参照することになるかと思います。 以下はCTAS文の抜粋です。例えば、SELECT文でカッコをつけても正常にパースしたい構文を追加する例をまずはあげてみます。  CREATE TABLE (IF NOT EXISTS)? qualifiedName    (COMMENT string)?    (WITH tableProperties)? AS query    (WITH (NO)? DATA)?                                             #createTableAsSelect 修正例はこんな感じになります。右側のカッコはエスケープするためにクォートで囲んでいます。 なんとなくイメージがつくと思いますが、|はORの役割を果たしているのでqueryもしくは(query)をこれは表しています。  CREATE TABLE (IF NOT EXISTS)? qualifiedName    (COMMENT string)?    (WITH tableProperties)? AS (query | '('query')')    (WITH (NO)? DATA)?                                             #createTableAsSelect SqlBase.g4を修正したtrino-par...

Presto meetup #3

6/15に行われたPresto Meetup 第3回に参加してきました。実際に運用されている方々の話はやっぱり勉強になりますね。 Presto Update by @Lewuathe 0.152から0.178へのアップグレード時の変更点などの説明。 EXPLAIN (type VALIDATE)は他のDWH製品から移行を検討する時に使えそう。Lambda式は使い所があまり分かっていなかったけれど、複数カラムに対しては便利ということに納得しました。 Presto at Treasure Data by @taroleo 単に時間がかかるクエリが問題なのではなく、普段より遅いクエリが問題という問題設定方法がおぉーと思いました。PrestoのログをPrestoで分析してるのは再帰的な感じがして面白いですね。 Prestoベースのマネージドクエリサービス Amazon Athena by 志村 誠さん AWSユーザーが多かったのか、質問タイムが大盛況。Athenaについてはあまり調べてなかったのですが、これを機に今後はちょくちょくチェックしていきたいと思います。 Presto - 僕とヤフーと時々Teradata(仮) by @uokada 既存のシステムをPrestoに置き換えて97%高速化したお話。この夏、EmbulkのORCアウトプットが作成されるということで楽しみにしています。 DMMでのprestoおよび周辺エコシステムの運用事例 by @r_megane 主に日中に使われるアドホック用と夜間に使われるバッチ用にクラスタを分けていて、夜間帯はアドホック用のWorkerをバッチ用クラスタに追加するという使い方。ここらへん、わざわざクラスタを分けずに、ユーザーの設定や他DWHのスロットルみたいな感じでできたら便利そうな気がしますね。

Run Presto Product Test

Prestoには 特に設定せずに使えるテストに加えて、product-testというものが存在します。これは裏でDockerでHadoop, MySQL, PostgreSQL, Cassandra, SQL Serverを立ち上げておいて、そのDBに対してクエリを発行し、テストするものです。各コネクタ内のDBはドライバが提供しているEmbedded Serverを立ち上げられる機能等を利用しています。コネクタ内のDBバージョンとproduct-testのバージョンをあえて分けることで複数バージョンに対する保証にもなっています。例えばCassandraはコネクタ内のテストで使用しているバージョンは2.xでproduct-test内のバージョンは3.xとなっています。 それではMac上での最初の設定方法を書いていきます。シェル上で実行する方法もありますが、一番実行することの多そうなIntelliJ上でのテスト方法について書いていきます。MacとUbuntuとで多少異なる部分もありますが、基本的には同じ流れです。 シェルでの実行方法や最新の情報を見たい場合は こちら をご覧ください。 1 リポジトリ直下でビルド ./mvnw install -DskipTests 2 テスト対象のコンテナを起動 必要であれば全部起動させますが、1個だけでももちろん大丈夫です。 ※SQL Serverを使用する場合は事前にメモリを3.25GB以上をDockerに割り当てておく必要があります。起動する際も容量が空いてないと失敗します。 presto-product-tests/conf/docker/singlenode/compose.sh up -d hadoop-master presto-product-tests/conf/docker/singlenode/compose.sh up -d mysql presto-product-tests/conf/docker/singlenode/compose.sh up -d postgres presto-product-tests/conf/docker/singlenode/compose.sh up -d cassandra presto-product-tests/conf/docker/singl...

Setup Presto Dev Environment

半年ほど前から密かに Presto にコントリビュートしているんですが、メモも兼ねて自分が送ったPRや開発のTipsについて書いていきたいと思います。開発言語はJavaなのと、直すべきところも多々あるので比較的コントリビュートしやすいOSSな気がします。次に開発環境ですが、Windowsはサポートされていません。頑張れば出来るかもしれませんが、スタイルチェッカーで文字コード等々が弾かれエラーになります。俺はッWindowsを愛しているんだッ…!という方はこちらのIssueに対応しましょう Windows Support #2351 。約2年以上経過していますが、0/12という進捗率です…。僕は基本Macで時々VM内のUbuntu上で開発しています。後々詳しく書きますが、Dockerを使うテストがあるので、その時はやはりUbuntu上で動かすことが多いです。 準備としてIntellij IDEAとPrestoをローカルにクローン/ダウンロードしておきます。 最新のRequirmentsは こちら をご覧ください。 1 Terminalからリポジトリの直下でビルド 環境によっては数十分かかるかもしれないので気長に待ちましょう。 mvn clean install -DskipTests 2 IDEA上でプロジェクトをImport Intellij IDEAを起動し、Import Projectでリポジトリ直下のpom.xmlを選択します。そこから先は適当にNextを連打し、JDKの選択画面では1.8のパスを選択します。 3 IDEA上でPrestoサーバーを起動 プロジェクトのフォルダで以下のファイルまで移動し、右クリックでCreate ‘PrestoServer.main()’…とした後に、VM OptionsとWorking directoryを入力します。 presto-main/src/main/java/com/facebook/presto/server/PrestoServer.java VM Options: -ea -XX:+UseG1GC -XX:G1HeapRegionSize=32M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -Xmx2G -Dcon...