<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sql | Democratizing Data</title><link>https://b94feae1.chezo-uno.pages.dev/categories/sql/</link><atom:link href="https://b94feae1.chezo-uno.pages.dev/categories/sql/index.xml" rel="self" type="application/rss+xml"/><description>Sql</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><copyright>© Aki Ariga 2017-2025</copyright><lastBuildDate>Thu, 05 May 2022 20:31:05 -0700</lastBuildDate><image><url>https://b94feae1.chezo-uno.pages.dev/media/icon_hu_9ca82a90e0d162db.png</url><title>Sql</title><link>https://b94feae1.chezo-uno.pages.dev/categories/sql/</link></image><item><title>Create data lineage from Trino/Hive queries in digdag log with Python</title><link>https://b94feae1.chezo-uno.pages.dev/blog/2022-05-05-sqllineage-with-digdag-log/</link><pubDate>Thu, 05 May 2022 20:31:05 -0700</pubDate><guid>https://b94feae1.chezo-uno.pages.dev/blog/2022-05-05-sqllineage-with-digdag-log/</guid><description>&lt;h2 id="whats-data-lineage">What&amp;rsquo;s data lineage?&lt;/h2>
&lt;p>Data lineage is something to describe &amp;ldquo;Where this data comes from and where it goes?&amp;rdquo;&lt;/p>
&lt;p>I learned this term in my previous job. They provided &amp;ldquo;Cloudera Navigator&amp;rdquo; which includes data lineage from execution logs of Hive/Spark etc.&lt;/p>
&lt;figure>&lt;img src="https://b94feae1.chezo-uno.pages.dev/blog/2022-05-05-sqllineage-with-digdag-log/nav_lineage.webp">&lt;figcaption>
&lt;h4>lineage of Cloudera Navigator via https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/cn_lineage_generation.html&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;h2 id="sqllineage-is-awesome-open-source-tool-for-visualizing-lineage">sqllineage is awesome open source tool for visualizing lineage&lt;/h2>
&lt;p>Recently, I learned there is a Python package so called sqllinage, that makes analyze and visualize data lineage from SQLs.&lt;/p>
&lt;div class="iframely-embed">&lt;div class="iframely-responsive" style="height: 140px; padding-bottom: 0;">&lt;a href="https://github.com/reata/sqllineage" data-iframely-url="//iframely.net/4q6WPtz?card=small">&lt;/a>&lt;/div>&lt;/div>&lt;script async src="//iframely.net/embed.js" charset="utf-8">&lt;/script>
&lt;p>sqllineage consists of Python implementation to analyze SQL and web application written in React.&lt;/p>
&lt;h2 id="visualize-data-lineage-from-treasure-datas-workflow-logs">Visualize data lineage from Treasure Data&amp;rsquo;s workflow logs&lt;/h2>
&lt;p>I found that Treasure Data&amp;rsquo;s workflow log outputs SQLs in its log. But it still needs to format pure SQLs.&lt;/p>
&lt;p>Then, I create digdaglog2sql to extract SQLs from Treasure Workflow logs.&lt;/p>
&lt;div class="iframely-embed">&lt;div class="iframely-responsive" style="height: 140px; padding-bottom: 0;">&lt;a href="https://github.com/chezou/digdaglog2sql" data-iframely-url="//iframely.net/5Up1iQ9?card=small">&lt;/a>&lt;/div>&lt;/div>&lt;script async src="//iframely.net/embed.js" charset="utf-8">&lt;/script>
&lt;p>You can use it with Python 3.7+. Here is the overview of the usage and check details on GitHub.&lt;/p>
&lt;p>Install via pip:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">pip install --user digdaglog2sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you have a workflow log downloaded from Treasure Data, you can convert into SQL as:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">digdaglog2sql --input workflow-log.txt --output output.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Or, if you want extract SQLs from specific workflow, you can use Session ID of it.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">TD_API_KEY&lt;/span>&lt;span class="o">=&lt;/span>1234XXX/YYYYYYYY
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">digdaglog2sql --session-id &lt;span class="m">12345&lt;/span> --site us --output output.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can fetch SQLs from your hosted digdag as the following:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">digdaglog2sql --session-id &lt;span class="m">12345&lt;/span> --endpoint digdag.example.com --output output.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;del>Note that, as of May 5, 2022, sqllineage and sqlparse, which is an important backend of sqllineage, are not fully compatible with Trino and Hive queries.&lt;/del>&lt;/p>
&lt;div class="flex px-4 py-3 mb-6 rounded-md bg-primary-100 dark:bg-primary-900">
&lt;span class="pr-3 pt-1 text-primary-600 dark:text-primary-300">
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m11.25 11.25l.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0a9 9 0 0 1 18 0m-9-3.75h.008v.008H12z"/>&lt;/svg>
&lt;/span>
&lt;span class="dark:text-neutral-300">&lt;p>As of 2022/05/11, the issues in sqllineage around Hive/Trino were fixed and it is available in 1.3.5 on PyPI.
It means, you don&amp;rsquo;t have to have node for sqllineage installation from source.&lt;/p>
&lt;p>As of 2022/10/06, the issue in sqlparse was resolved in 0.4.3.&lt;/p>
&lt;/span>
&lt;/div>
&lt;p>&lt;del>These are the PRs that approaches the issues:&lt;/del>&lt;/p>
&lt;ul>
&lt;li>✅ &lt;a href="https://github.com/reata/sqllineage/pull/252" target="_blank" rel="noopener">https://github.com/reata/sqllineage/pull/252&lt;/a> -&amp;gt; Released in 1.3.5&lt;/li>
&lt;li>✅ &lt;a href="https://github.com/reata/sqllineage/pull/255" target="_blank" rel="noopener">https://github.com/reata/sqllineage/pull/255&lt;/a> -&amp;gt; Released in 1.3.5&lt;/li>
&lt;li>✅ &lt;a href="https://github.com/andialbrecht/sqlparse/pull/662" target="_blank" rel="noopener">https://github.com/andialbrecht/sqlparse/pull/662&lt;/a> -&amp;gt; Released in 0.4.3&lt;/li>
&lt;li>✅ &lt;a href="https://github.com/andialbrecht/sqlparse/pull/664" target="_blank" rel="noopener">https://github.com/andialbrecht/sqlparse/pull/664&lt;/a> -&amp;gt; Released in 0.4.3&lt;/li>
&lt;/ul>
&lt;p>&lt;del>Don&amp;rsquo;t worry about it. I prepared patched branches on GitHub. You can install sqllineage and sqlparse as the following:&lt;/del>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">pip install git+https://github.com/chezou/sqlparse.git@trino#egg&lt;span class="o">=&lt;/span>&lt;span class="nv">sqlparse&lt;/span>&lt;span class="o">==&lt;/span>0.4.3.dev0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install sqllineage
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;del>If you see some error on installation of sqllineage, double-check if you have node installed.&lt;/del>&lt;/p>
&lt;p>Then, you can visualize your SQL file as:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ sqllineage -g -f output.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> * SQLLineage Running on http://localhost:5000/?f&lt;span class="o">=&lt;/span>output.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now you can see visualization of data linage, both table level and column level.&lt;/p>
&lt;figure>&lt;img src="https://b94feae1.chezo-uno.pages.dev/blog/2022-05-05-sqllineage-with-digdag-log/featured.webp">&lt;figcaption>
&lt;h4>SQL lineageの例&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>Let&amp;rsquo;s try sqllineage!&lt;/p></description></item><item><title>sqllineage を使って digdag のログから Treasure Data のクエリのリネージを作ってみた</title><link>https://b94feae1.chezo-uno.pages.dev/post/2022-05-05-sqllineage-with-digdag-log/</link><pubDate>Thu, 05 May 2022 19:58:10 -0700</pubDate><guid>https://b94feae1.chezo-uno.pages.dev/post/2022-05-05-sqllineage-with-digdag-log/</guid><description>&lt;p>データリネージとは、DBなどでどのデータがどこから来てどこに行った、という「来歴」とも呼ばれる情報です。&lt;/p>
&lt;p>自分がこの言葉を知ったのは、前職でCloudera Navigatorという製品を扱ったときにこの機能が実装されていることを知りました。
引き継いだ複雑なSQLなどのワークフローを渡されたときに、どういう流れになっているのかを可視化できるのがとても魅力でした。&lt;/p>
&lt;figure>&lt;img src="https://b94feae1.chezo-uno.pages.dev/post/2022-05-05-sqllineage-with-digdag-log/nav_lineage.webp">&lt;figcaption>
&lt;h4>Cloudera Navigatorのlineage。 https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/cn_lineage_generation.html より&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>そんなlineageですが、Pythonの sqllineage というパッケージで分析・可視化できることを知りました。&lt;/p>
&lt;div class="iframely-embed">&lt;div class="iframely-responsive" style="height: 140px; padding-bottom: 0;">&lt;a href="https://github.com/reata/sqllineage" data-iframely-url="//iframely.net/4q6WPtz?card=small">&lt;/a>&lt;/div>&lt;/div>&lt;script async src="//iframely.net/embed.js" charset="utf-8">&lt;/script>
&lt;p>sqllineage は Pythonで実装されているSQLのlinegaeを解析する部分と、Reactで実装された可視化のウェブアプリケーション sqllineagejs で成り立っています。&lt;/p>
&lt;p>実は去年ぐらいにちらほら使っている人がいたのは後から知りました。&lt;/p>
&lt;div class="iframely-embed">&lt;div class="iframely-responsive" style="height: 140px; padding-bottom: 0;">&lt;a href="https://dev.classmethod.jp/articles/try-sqllineage/" data-iframely-url="//iframely.net/XlQhNj3?card=small">&lt;/a>&lt;/div>&lt;/div>&lt;script async src="//iframely.net/embed.js" charset="utf-8">&lt;/script>
&lt;/br>
&lt;div class="iframely-embed">&lt;div class="iframely-responsive" style="height: 140px; padding-bottom: 0;">&lt;a href="https://zenn.dev/yohei/articles/2021-05-08-sql-lineage-snowflake" data-iframely-url="//iframely.net/jwgoEni?card=small">&lt;/a>&lt;/div>&lt;/div>&lt;script async src="//iframely.net/embed.js" charset="utf-8">&lt;/script>
&lt;p>これを使ってTreasure Dataのデータの流れの可視化をしてみたいと思ったのですが、TDではちょうどworkflowエンジンのdigdagのログに実行されたSQLが書かれているのに気づきました。&lt;/p>
&lt;p>そこで、digdagのTDのSQLを実行する &lt;code>td&amp;gt;&lt;/code>, &lt;code>td_ddl&amp;gt;&lt;/code> オペレータからSQLを抽出・変換するコマンド、 digdaglog2sql を作り、可視化をしてみました。&lt;/p>
&lt;div class="iframely-embed">&lt;div class="iframely-responsive" style="height: 140px; padding-bottom: 0;">&lt;a href="https://github.com/chezou/digdaglog2sql" data-iframely-url="//iframely.net/5Up1iQ9?card=small">&lt;/a>&lt;/div>&lt;/div>&lt;script async src="//iframely.net/embed.js" charset="utf-8">&lt;/script>
&lt;p>詳しい使い方は、GitHubを見ていただければと思いますが、Python 3.7以上が入っている環境であれば、pipで簡単にインストールできます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">pip install --user digdaglog2sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>TDからダウンロードしてきたワークフローのログがあれば、そこからSQLを抽出して保存できます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">digdaglog2sql --input workflow-log.txt --output output.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>また、ワークフローのSession IDを指定すれば、そこからSQLに変換した結果を保存できます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">TD_API_KEY&lt;/span>&lt;span class="o">=&lt;/span>1234XXX/YYYYYYYY
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">digdaglog2sql --session-id &lt;span class="m">12345&lt;/span> --site us --output output.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>また、endpointオプションを使えば自前でホストしたdigdagからもSQLを取得できます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">digdaglog2sql --session-id &lt;span class="m">12345&lt;/span> --endpoint digdag.example.com --output output.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;del>注意点としては、2022/05/05現在のPyPIにある sqllineage と その裏側で依存している sqlparse の最新バージョンでは、 Trino やHiveなどの一部の機能がうまくColumnレベルのlineageの解析ができません。&lt;/del>&lt;/p>
&lt;div class="flex px-4 py-3 mb-6 rounded-md bg-primary-100 dark:bg-primary-900">
&lt;span class="pr-3 pt-1 text-primary-600 dark:text-primary-300">
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m11.25 11.25l.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0a9 9 0 0 1 18 0m-9-3.75h.008v.008H12z"/>&lt;/svg>
&lt;/span>
&lt;span class="dark:text-neutral-300">&lt;p>2022/05/11 現在、sqllineageの Hive, Trino に関する問題は修正され 1.3.5 でリリースされました。
これに伴い、sqllineageをsourceからインストールする際に必要だったnodeも不要になりました。&lt;/p>
&lt;p>2022/10/06 sqlparseの 0.4.3 もリリースされたので　upstreamの修正はすべて反映されました。&lt;/p>
&lt;/span>
&lt;/div>
&lt;p>&lt;del>今、Pull Requestを出しているところなので、これらがリリースされれば解決されると思います。&lt;/del>&lt;/p>
&lt;ul>
&lt;li>✅ &lt;a href="https://github.com/reata/sqllineage/pull/252" target="_blank" rel="noopener">https://github.com/reata/sqllineage/pull/252&lt;/a> -&amp;gt; 1.3.5 でリリース済み&lt;/li>
&lt;li>✅ &lt;a href="https://github.com/reata/sqllineage/pull/255" target="_blank" rel="noopener">https://github.com/reata/sqllineage/pull/255&lt;/a> -&amp;gt; 1.3.5 でリリース済み&lt;/li>
&lt;li>✅ &lt;a href="https://github.com/andialbrecht/sqlparse/pull/662" target="_blank" rel="noopener">https://github.com/andialbrecht/sqlparse/pull/662&lt;/a> -&amp;gt; 0.4.3 でリリース済み&lt;/li>
&lt;li>✅ &lt;a href="https://github.com/andialbrecht/sqlparse/pull/664" target="_blank" rel="noopener">https://github.com/andialbrecht/sqlparse/pull/664&lt;/a> -&amp;gt; 0.4.3 でリリース済み&lt;/li>
&lt;/ul>
&lt;p>&lt;del>ひとまず、パッチを当てたbranchをGitHubに用意したので、 nodeをインストールした環境で 以下のようにインストールしてください。&lt;/del>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">pip install git+https://github.com/chezou/sqlparse.git@trino#egg&lt;span class="o">=&lt;/span>&lt;span class="nv">sqlparse&lt;/span>&lt;span class="o">==&lt;/span>0.4.3.dev0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install sqllineage
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>sqllineageをインストールした後は、出力したSQLファイルを指定すれば、可視化できます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">$ sqllineage -g -f output.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> * SQLLineage Running on http://localhost:5000/?f&lt;span class="o">=&lt;/span>output.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>ブラウザを開けば、このようなColumnレベルやテーブルレベルの lineage が作成でき、拡大縮小もしながら眺められます。&lt;/p>
&lt;figure>&lt;img src="https://b94feae1.chezo-uno.pages.dev/post/2022-05-05-sqllineage-with-digdag-log/featured.webp">&lt;figcaption>
&lt;h4>SQL lineageの例&lt;/h4>
&lt;/figcaption>
&lt;/figure>
&lt;p>ぜひ、試してみてください。&lt;/p></description></item></channel></rss>