はじめに
BuildあたりでプレビューがはじまったSynapse Analytics Serverless SQL PoolでのDelta Lakeのチュートリアルを紹介します。
参考のMSDocsのチュートリアルの拡張版的にお使いください。
※2021/6の情報となります
参考:
Query Delta Lake files (preview) using serverless SQL pool in Azure Synapse Analytics
Query Delta Lake files using T-SQL language in Azure Synapse Analytics
Delta Lake について
まずは手前味噌ですが
Delta Lake概要
※0.3のころなので古い点あるかも
DatabricksのCSAの方がめちゃめちゃわかりやすく活用方法まで記事を書いてくれています。
サンプルコード
Spark Poolでデータを準備
Azure Open Datasetsからアメリカの人口データを使っていきます。
300万件くらいのデータです。
# Create Data Frame and Display
from azureml.opendatasets import UsPopulationCounty
population = UsPopulationCounty()
population_df = population.to_spark_dataframe()
display(population_df.limit(5))
# Write format Delta
(population_df.write
.format("delta")
.mode("overwrite")
.save("abfss://datalake@<Azure Data Lake Storage Gen2名を入れてください>.dfs.core.windows.net/bronze/UsPopulationCounty/"))
ちなみに
Spark SQLでテーブル登録
この場合はSparkテーブルとして登録されますが、今のところServerelssSQLPoolからはうまく動作しません。
CREATE TABLE UsPopulationCounty
USING DELTA
LOCATION 'abfss://datalake@<Azure Data Lake Storage Gen2名を入れてください>.dfs.core.windows.net/bronze/UsPopulationCounty/'
Serverless SQL Pool でクエリ
右クリックから100行選択→パスをフォルダに変えてFORMATをDELTAに変更するのが簡単です
SELECT
TOP 100 *
FROM
OPENROWSET(
BULK 'https://dlsanalyticsdemo.dfs.core.windows.net/datalake/bronze/UsPopulationCounty/',
FORMAT='DELTA'
) AS [result]
Serverless SQL Pool 上で外部テーブル化
こちらも右クリックからスクリプトを生成させるのが楽です。
フォーマットがDeltaで、locationがファイルになっているので、変更します。(ハイライト箇所)
修正後のSQL例
IF NOT EXISTS (SELECT * FROM sys.external_file_formats WHERE name = 'SynapseDeltaFormat')
CREATE EXTERNAL FILE FORMAT [SynapseDeltaFormat]
WITH ( FORMAT_TYPE = delta)
GO
IF NOT EXISTS (SELECT * FROM sys.external_data_sources WHERE name = 'datalake_<>_dfs_core_windows_net')
CREATE EXTERNAL DATA SOURCE [datalake_<>_dfs_core_windows_net]
WITH (
LOCATION = 'https://<Storage Account 名>.dfs.core.windows.net/datalake',
)
Go
CREATE EXTERNAL TABLE dbo.UsPopulationCountrySQL (
[decennialTime] varchar(8000),
[stateName] varchar(8000),
[countyName] varchar(8000),
[population] int,
[race] varchar(8000),
[sex] varchar(8000),
[minAge] int,
[maxAge] int,
[year] int
)
WITH (
LOCATION = 'bronze/UsPopulationCounty/',
DATA_SOURCE = [datalake_<>_dfs_core_windows_net],
FILE_FORMAT = [SynapseDeltaFormat]
)
GO
SELECT TOP 100 * FROM dbo.UsPopulationCountrySQL
GO
実行後、外部テーブルとして表示されます。
なお、外部テーブル定義についてはデフォルトだと文字長が最大でとられてしまうので、適宜変更しましょう。