U-SQL 入門⑤ ~ データ型 ~

U-SQL のデータ型は通常の SQL とは異なり、C# のデータ型を使用します。間違えないように気を付けたいところ。
C# のデータ型は以下の URL を参照。
型 (C# リファレンス) | Microsoft Docs


下記のようにデータ型指定の隣に ? を付けると null 値を許容するという指定になります。

@searchlog =
    EXTRACT UserId          int,
            Start           DateTime,
            Region          string,
            Query           string,
            Duration        int?,
            Urls            string,
            ClickedUrls     string
    FROM "/Samples/Data/SearchLog.tsv"
    USING Extractors.Tsv();
Numeric 型
byte 符号なし 8 ビット整数
sbyte 符号付き 8 ビット整数
int 符号付き 32 ビット整数
uint 符号なし 32 ビット整数
long 符号付き 64 ビット整数
ulong 符号なし 64 ビット整数
float 32 ビット浮動小数
double 64 ビット浮動小数
decimal 128 ビット数値データ
short 符号付き 16 ビット整数
ushort 符号なし 16 ビット整数
Text 型
char Unicode 16 ビット文字
string * Unicode 文字コレクション
Complex 型
SQL.MAP キーと値
SQL.ARRAY 値のリスト
その他
DateTime 日時を表す
bool ブール値 (true / false) を格納
Guid グローバル一意識別子
byte[] * バイト配列

* string 型と byte[] 型は null 許容指定はできない。

この記事はこちらの公式ドキュメントを参考にしたものです。
https://msdn.microsoft.com/en-us/azure/data-lake-analytics/u-sql/built-in-u-sql-types

U-SQL 入門④ ~ FileSets ~

FileSets を使って複数のファイルを EXTRACT 文で読み込むことができます。

基本

以下のように 5 ファイルがある場合、

/input/2018-01-01.log
/input/2018-02-01.log
/input/2018-03-01.log
/input/2018-04-01.log
/input/2018-05-01.log

以下の EXTRACT 文で 5 ファイルをすべて読み込むことができます。また、{suffix} にマッチした部分を suffix 列に入れることができます。

@rs =
	EXTRACT
		user string,
		id string,
		suffix string
	FROM "/input/{suffix}.log"
	USING Extractors.Csv();

日付形式の対応

以下のように 5 ファイルがある場合、

/input/2018-01-01.log
/input/2018-02-01.log
/input/2018-03-01.log
/input/2018-04-01.log
/input/2018-05-01.log

以下の EXTRACT 文ではファイル名の日付情報を、DateTime 型の値として取得することができます。

@rs =
	EXTRACT
		user string,
		id string,
		date DateTime
	FROM "/input/{date:yyyy}-{date:MM}-{date:dd}.log"
	USING Extractors.Csv();

以下のようなフォルダ構成になっている場合、

/input/2017/01/01/data.txt
/input/2017/02/01/data.txt
/input/2017/03/01/data.txt
/input/2017/04/01/data.txt
/input/2017/05/01/data.txt

以下の EXTRACT 文でフォルダ構造から日付情報を、DateTime 型の値として取得することができます。

@rs =
	EXTRACT
		user string,
		id string,
		date DateTime
	FROM "/input/{date:yyyy}/{date:MM}/{date:dd}/data.txt"
	USING Extractors.Csv();

このデータに SELECT を実行する際に以下のように WHERE 句で DateTime 型の範囲でフィルターをかけることができます。

@rs =
	SELECT * FROM @rs
	WHERE 
		date >= System.DateTime.Parse("2018/1/1") AND
		date < System.DateTime.Parse("2018/2/28");

フィルターの効能

以下のようなファイルを読み込むとき、

/input/ja_data-01.log
/input/ja_data-02.log
/input/en_data-01.log
/input/en_data-02.log
/input/cn_data-01.log

以下の EXTRACT 文でファイル名の先頭にある文字列を {Market} に格納できます。

@rs =
	EXTRACT
		user string,
		id string,
		Market string
	FROM "/input/{Market}_{*}"
	USING Extractors.Csv();

SELECT 文を実行する際に以下のように Market 列でフィルターをかけると、/input/ja_data-01.log、/input/ja_data-02.log の 2 つのファイルのみが読み取られ、その他のファイルにはアクセスされないため、I/O 効率が良くなります。

@us =
	SELECT * FROM @rs
	WHERE Market == “ja" ;

U-SQL 入門③ ~ ファイルのアウトプット ~

U-SQL でのファイルのアウトプットは OUTPUT 文のTO 句 で PATH を指定して、 USING 句で Outputter を指定します。

OUTPUT @rows
    TO “/data.csv”
    USING Outputters.Csv();

Outputtersで書き込むファイルのフォーマットを指定します。

  • Outputters.Text(): フィールドのデリミタを指定して出力
  • Outputters.Csv(): CSV 形式を出力
  • Outputters.Tsv(): TSV 形式を出力
// ヘッダ付きの CSV 形式で出力する
OUTPUT @rows
    TO “/data.csv”
    USING Outputters.Csv(outputHeader: true);

// ダブルクォート無しで TSV 形式で出力する
OUTPUT @rows
    TO “/data.tsv”
    USING Outputters.Tsv(quoting: false);

// "|" で区切られたファイル形式で出力する
OUTPUT @rows
    TO “/data.txt”
    USING Outputters.Text(delimiter: '|');

Outputter 共通のパラメータ

パラメータ デフォルト値 指定できる値 説明
dateTimeFormat "o" datetime側のカラムがあった場合、このパラメータで出力フォーマットを指定できる。指定できるフォーマットはこちらに書いてある。
https://msdn.microsoft.com/library/az4se3k1(v=vs.110).aspx
encoding Encoding.UTF8 Encoding.[ASCII]
Encoding.BigEndianUnicode
Encoding.Unicode
Encoding.UTF7
Encoding.UTF8
Encoding.UTF32
ファイルのエンコード指定
escapeCharacter null エスケープ用の文字を指定
nullEscape null null 値と解釈する文字を指定
quoting true true
false
アウトプットするデータのフィールドを " (ダブルクォート) でくくるかどうか
rowDelimiter \r\n 行デリミタを指定。デフォルトではCRLF
outputHeader false true
ヘッダにフィールド名を付けるかどうか

U-SQL Built-in Outputters | Microsoft Docs

U-SQL 入門② ~ ファイルのインプット ~


U-SQL でのファイルのインプットは FROM 句で PATH を指定します。
※ストレージは ADLA のデータソースとして登録しておく必要があります。

ファイルインプットの例

// デフォルトの ADLS の PATH を指定する場合
@rows = 
     EXTRACT name string, id int
     FROM “/…/data.csv”
     USING Extractors.Csv();

// ADLS を指定する絶対パスの場合
@rows = 
     EXTRACT name string, id int
     FROM “adl://…/data.csv”
     USING Extractors.Csv();

// Blob ストレージを指定する場合
@rows = 
    EXTRACT name string, id int
    FROM  “wasb://…/data.csv”
    USING Extractors.Csv();

USING 句で Extractor を指定して、読み込むファイルのフォーマットを指定します。
ビルトインの Extractor は以下の 3 つがあります。

  • Extractors.Text() : ファイルを指定したデリミタで区切って読み取る
  • Extractors.Csv() : CSV ファイルを読み取る
  • Extractors.Tsv() : TSV ファイルを読み取る
// "|" で区切られたテキストファイルを読み込む。最初の 1 行目はスキップする
@rows =
	EXTRACT name string, id int,
	FROM "/file.text"
	USING Extractors.text(delimiter: "|", skipFirstNRows: 1)

// CSV ファイルを読み込む。カラム数が合わない場合やデータ型が合わない場合はその行をスキップする
@rows =
	EXTRACT name string, id int,
	FROM "/file.csv"
	USING Extractors.csv(silent: true)

// TSV ファイルを読み込む。ASCII エンコードを指定
@rows =
	EXTRACT name string, id int,
	FROM "/file.tsv"
USING Extractors.csv(encoding: Encoding.[ASCII])

Extractor の共通パラメータ

パラメータ デフォルト値 指定できる値 説明
encoding Engoding.UTF8 Encoding.[ASCII]
Encoding.BigEndianUnicode
Encoding.Unicode
Encoding.UTF7Encoding.UTF8
Encoding.UTF32
ファイルのエンコード指定
escapeCharacter null エスケープ用の文字を指定
nullExcape null null 値と解釈する文字を指定
quoting true true
false
カラムのフィールドの " (ダブルクォート) を考慮にいれるかどうか現在は " (ダブルクォート) 以外には対応していない
rowDelimiter "\r\n"
"\r"
"\n"
行のセパレータを何にするか。デフォルトでは改行コードが指定される
silent false true
false
指定したカラム数と違うカラム数の行が見つかった場合や指定したものと異なるデータ型があった場合に、スキップして読み込むか、それともエラーを吐いて処理を止めるか
skipFirstNRows 0 読み込むときに先頭から指定した行数だけスキップする


U-SQL Built-in Extractors | Microsoft Docs

U-SQL 入門① ~ U-SQL の基本形 ~

Azure Data Lake Analytics の U-SQL というクエリ言語についてメモ用に基本的な事をまとめていきます。

Azure Data Lake そのものについてや構築方法等はこちらのブログ (Data Platform Tech Sales Team Blog | Azure Data Lake)を見るとわかりやすいと思います。

 

U-SQL とは?

  • SQLC# の拡張を備えたクエリ言語
  • 主にデータの変換や分析のために使われる
  • 構造/非構造化データを取り扱える
  • 分散処理されるため大容量のデータセットに対してのクエリが可能

U-SQL の基本形

@searchlog =
   EXTRACT UserId          int,
          
Start           DateTime,
           Region          string,
           Query           string,
           Duration        int?,
           Urls            string,
           ClickedUrls     string
          
FROM "/Samples/Data/SearchLog.tsv"
  
USING Extractors.Tsv();
 
@rs1 =
  
SELECT Start, Region, Duration
    
FROM @searchlog
  
WHERE Region == "en-gb";
 
OUTPUT @rs1  
  
TO "/output/SearchLog-transform-rowsets.csv"
  
USING Outputters.Csv();

それぞれの個所で以下のような動作をする。

EXRACT の個所

  • /Samples/Data/SearchLog.tsv ファイルを読み込む
  • Extractors.Tsv() でタブで区切る
  • UserId, Start, ... と列名を付与し、データ型も定義
  • @searchlog という変数にセット

SELECT の個所

  • @searchlog に対して SELECT を実行
  • Region 列の値が en-gb のデータにフィルタ
  • Start, Region, Duration 列のみを選択
  • @rs1 変数にセット

OUTPUT の個所

  • @rs1 にセットされた SELECT の結果を /output/SearchLog-transform-rowsets.csv というファイルに書き出す
  • Outputters.Csv() によって CSV フォーマットに変換される

 

Azure Data Lake Analytics

azure.microsoft.com