0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Microsoft FabricAdvent Calendar 2024

Day 12

Microsoft Fabric OneLake を DuckDB で分析する

Posted at

はじめに

OneLakeはDelta Lakeを標準フォーマットとして採用しているため、3rd partyツールでの分析が可能です。

今回は、Delta Lakeへのサポートが追加されたDuck DBを使用することで、Fabricのコンピューティングエンジンを利用せずにSQL分析を実施してみます。Duck DBを使用することで、軽量かつ高速なSQL分析が可能となり、Fabricのリソースを節約できます。

参考

案1 azure Storage として接続する

構成イメージ

image.png

手順

  1. onelake 側の準備として、レイクハウス or ウェアハウス上のテーブルを作成し、プロパティから abfss パスを取得します。※今回はサンプルウェアハウスを使用
    image.png

  2. 必要なモジュールをインストールします。

    python
    
    %pip install azure-identity
    %pip install  duckdb --upgrade
    
    
  3. OneLake に接続するためのtoken取得

    python
    def get_token():
        from azure.identity import InteractiveBrowserCredential
        token = InteractiveBrowserCredential().get_token("https://storage.azure.com/.default")
        return token.token
    
    
    python
    token = get_token()
    
  4. duck db からOneLake に接続確認

    python
    
    import time
    import duckdb
    
    con = duckdb.connect(f'temp_{time.time_ns()}.duckdb')
    con.sql('SET enable_object_cache=true')
    con.sql(f""" CREATE or replace SECRET onelake ( TYPE AZURE, PROVIDER ACCESS_TOKEN, ACCESS_TOKEN '{token}')   """)
    
    path="最初に取得したabfss パスを設定"
    con.sql(f"""SELECT COUNT(1) FROM delta_scan('{path}') """).show()
    
    

    image.png

  5. duck db 上にビューを作成

    python
    
    def create_local_view(con,path,schema,table):
    
        con.sql(f"CREATE SCHEMA IF NOT EXISTS {schema};")
        con.sql(f"""CREATE OR REPLACE view {schema}.{table} AS SELECT * FROM delta_scan('{path}'); """)
    
    
    python
    
    create_local_view(con, path, "dbo", '"Trip"')
    
    
  6. 分析クエリが実行できるようになります。

    python
    
    con.sql(""" SELECT [DateID],COUNT(1) as TripCount
    FROM dbo."Trip"
    GROUP BY [DateID]
    ORDER BY 2 DESC
     """) 
    
    
    ┌─────────────────────────┬───────────┐
    │ main.list_value(DateID) │ TripCount │
    │         int32[]         │   int64   │
    ├─────────────────────────┼───────────┤
    │ [20131101]              │      9985 │
    │ [20130511]              │      9953 │
    │ [20130426]              │      9765 │
    │ [20130302]              │      9681 │
    │ [20131004]              │      9656 │
    │ [20130111]              │      9503 │
    │ [20131212]              │      9456 │
    │ [20131011]              │      9449 │
    │ [20130315]              │      9431 │
    │ [20130502]              │      9411 │
    │     ·                   │        ·  │
    │     ·                   │        ·  │
    │     ·                   │        ·  │
    │ [20130121]              │      5484 │
    │ [20131128]              │      5243 │
    │ [20131226]              │      5149 │
    │ [20130902]              │      4858 │
    │ [20131225]              │      4776 │
    │ [20130704]              │      4667 │
    │ [20130803]              │      3707 │
    │ [20130802]              │      3609 │
    │ [20130804]              │      3291 │
    │ [20130811]              │      3279 │
    ├─────────────────────────┴───────────┤
    │ 365 rows (20 shown)       2 columns │
    └─────────────────────────────────────┘
    

    2.1 秒で応答しています。
    image.png

案2 local file として接続する

この方式は結論からいうと、空白を含むパスへの delta_scanが対応していないためにうまくいきませんでした。

OneLake ファイルエクスプローラーを使用すると、OneLake 上の Delta Parquet を OneDrive のようにローカル環境に同期できます。
これを利用して、より簡単に DuckDB からローカル環境の Delta Parquet に接続してみます。

image.png

構成イメージ

image.png

手順

  1. OneLake ファイルエクスプローラーから、対象のレイクハウス or ウェアハウスで、データを保持するように右クリック設定します。
    image.png
  2. 対象のテーブルフォルダのパスをコピーして、delta_scanで select します。・・・が、失敗。シンボリックリンクや、カレントディレクトリを変えたりしてみましたが、うまくいかず今回は供養までとします。
    image.png
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?