Azure Data Lake Analytics에서 U-SQL 시작Get started with U-SQL in Azure Data Lake Analytics

U-SQL은 선언적 SQL을 명령적 C#에 결합하여 규모에 관계 없이 데이터를 처리할 수 있도록 하는 언어입니다.U-SQL is a language that combines declarative SQL with imperative C# to let you process data at any scale. U-SQL의 확장성 있는 분산 쿼리 기능을 통해 Azure SQL Database와 같은 관계형 저장소의 데이터를 효율적으로 분석할 수 있습니다.Through the scalable, distributed-query capability of U-SQL, you can efficiently analyze data across relational stores such as Azure SQL Database. U-SQL을 사용하면 읽기에 대한 스키마를 적용하고 사용자 지정 논리 및 UDF를 삽입하여 구조화되지 않은 데이터를 처리할 수 있습니다.With U-SQL, you can process unstructured data by applying schema on read and inserting custom logic and UDFs. 또한 U-SQL에는 모든 규모에서 실행하는 방법을 세부적으로 제어할 수 있게 해주는 확장성이 포함되어 있습니다.Additionally, U-SQL includes extensibility that gives you fine-grained control over how to execute at scale.

학습 리소스Learning resources

사전 요구 사항Prerequisites

이 문서의 U-SQL 샘플을 살펴본 후에 자습서: Visual Studio용 데이터 레이크 도구를 사용하여 U-SQL 스크립트 개발을 읽고 완료하세요.Before you go through the U-SQL samples in this document, read and complete Tutorial: Develop U-SQL scripts using Data Lake Tools for Visual Studio. 이 자습서는 Azure Data Lake Tools for Visual Studio에서 U-SQL을 사용하는 기법에 대해 설명합니다.That tutorial explains the mechanics of using U-SQL with Azure Data Lake Tools for Visual Studio.

첫 번째 U-SQL 스크립트Your first U-SQL script

다음 U-SQL 스크립트는 간단하며 U-SQL 언어의 많은 측면을 파악하도록 합니다.The following U-SQL script is simple and lets us explore many aspects the U-SQL language.

@searchlog =
    EXTRACT UserId          int,
            Start           DateTime,
            Region          string,
            Query           string,
            Duration        int?,
            Urls            string,
            ClickedUrls     string
    FROM "/Samples/Data/SearchLog.tsv"
    USING Extractors.Tsv();

OUTPUT @searchlog
    TO "/output/SearchLog-first-u-sql.csv"
    USING Outputters.Csv();

이 스크립트에는 변환 단계가 없습니다.This script doesn't have any transformation steps. SearchLog.tsv라는 원본 파일을 읽어와서 스키마를 만들고, 행 집합을 SearchLog-first-u-sql.csv 파일에 다시 씁니다.It reads from the source file called SearchLog.tsv, schematizes it, and writes the rowset back into a file called SearchLog-first-u-sql.csv.

Duration 필드의 데이터 형식 옆에 있는 물음표를 보세요.Notice the question mark next to the data type in the Duration field. 이는 Duration 필드가 null이어도 된다는 것을 의미합니다.It means that the Duration field could be null.

주요 개념Key concepts

  • Rowset 변수: 행 집합을 생성하는 각 쿼리 식은 변수에 할당될 수 있습니다.Rowset variables: Each query expression that produces a rowset can be assigned to a variable. U-SQL은 스크립트의 T-SQL 변수 이름 지정 패턴(예: @searchlog)을 따릅니다.U-SQL follows the T-SQL variable naming pattern (@searchlog, for example) in the script.
  • EXTRACT 키워드는 파일에서 데이터를 읽고 읽기에 대한 스키마를 정의합니다.The EXTRACT keyword reads data from a file and defines the schema on read. Extractors.Tsv는 탭으로 구분된 값 파일에 대한 기본 제공 U-SQL 추출기입니다.Extractors.Tsv is a built-in U-SQL extractor for tab-separated-value files. 사용자 지정 추출기를 개발할 수 있습니다.You can develop custom extractors.
  • OUTPUT은 행 집합의 데이터를 파일에 씁니다.The OUTPUT writes data from a rowset to a file. Outputters.Csv()는 쉼표로 구분된 값 파일을 만들기 위한 기본 제공 U-SQL 출력기입니다.Outputters.Csv() is a built-in U-SQL outputter to create a comma-separated-value file. 사용자 지정 출력기를 개발할 수 있습니다.You can develop custom outputters.

파일 경로File paths

EXTRACT 및 OUTPUT 문은 파일 경로를 사용합니다.The EXTRACT and OUTPUT statements use file paths. 파일 경로는 절대 경로 또는 상대 경로일 수 있습니다.File paths can be absolute or relative:

다음에 나오는 이 절대 파일 경로는 mystore라는 Data Lake Store의 파일을 참조합니다.This following absolute file path refers to a file in a Data Lake Store named mystore:

adl://mystore.azuredatalakestore.net/Samples/Data/SearchLog.tsv

다음에 나오는 이 파일 경로는 "/"로 시작합니다.This following file path starts with "/". 기본 Data Lake Store 계정의 파일을 참조합니다.It refers to a file in the default Data Lake Store account:

/output/SearchLog-first-u-sql.csv

스칼라 변수 사용Use scalar variables

스크립트 유지 관리를 간편하게 만들기 위해 스칼라 변수를 사용할 수 있습니다.You can use scalar variables as well to make your script maintenance easier. 이전 U-SQL 스크립트를 다음과 같이 작성할 수도 있습니다.The previous U-SQL script can also be written as:

DECLARE @in  string = "/Samples/Data/SearchLog.tsv";
DECLARE @out string = "/output/SearchLog-scalar-variables.csv";
@searchlog =
    EXTRACT UserId          int,
            Start           DateTime,
            Region          string,
            Query           string,
            Duration        int?,
            Urls            string,
            ClickedUrls     string
    FROM @in
    USING Extractors.Tsv();
OUTPUT @searchlog
    TO @out
    USING Outputters.Csv();

변환 행 집합Transform rowsets

SELECT 를 사용하여 행 집합을 변환합니다.Use SELECT to transform rowsets:

@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();

WHERE 절에는 C# 부울 식을 사용합니다.The WHERE clause uses a C# Boolean expression. 자신의 식 및 함수에 C# 식 언어를 사용할 수 있습니다.You can use the C# expression language to do your own expressions and functions. 식 및 함수를 논리 결합(ANDs) 및 분리(ORs)와 결합하여 더 복잡한 필터링을 수행할 수 있습니다.You can even perform more complex filtering by combining them with logical conjunctions (ANDs) and disjunctions (ORs).

다음 스크립트는 DateTime.Parse() 메서드와 논리 결합을 사용합니다.The following script uses the DateTime.Parse() method and a conjunction.

@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";
@rs1 =
    SELECT Start, Region, Duration
    FROM @rs1
    WHERE Start >= DateTime.Parse("2012/02/16") AND Start <= DateTime.Parse("2012/02/17");
OUTPUT @rs1
    TO "/output/SearchLog-transform-datetime.csv"
    USING Outputters.Csv();

참고

두 번째 쿼리는 첫 번째 행 집합의 결과를 기반으로 작동하며, 두 필터의 결합이 결과가 됩니다.The second query is operating on the result of the first rowset, which creates a composite of the two filters. 또한 변수 이름은 재사용이 가능하며 이름에는 어휘 범위(정적 범위)가 적용됩니다.You can also reuse a variable name, and the names are scoped lexically.

집계 행 집합Aggregate rowsets

U-SQL에는 개발자에게 친숙한 ORDER BY, GROUP BY 및 집계가 제공됩니다.U-SQL gives you the familiar ORDER BY, GROUP BY, and aggregations.

다음 쿼리는 지역 당 총 기간을 알아내고 최장 기간 다섯 개를 순서대로 표시합니다.The following query finds the total duration per region, and then displays the top five durations in order.

U-SQL 행 집합은 다음 쿼리를 위해 이 순서를 유지하지 않습니다.U-SQL rowsets do not preserve their order for the next query. 따라서 출력 순서를 정하려면 OUTPUT 문에 ORDER BY를 추가해야 합니다.Thus, to order an output, you need to add ORDER BY to the OUTPUT statement:

DECLARE @outpref string = "/output/Searchlog-aggregation";
DECLARE @out1    string = @outpref+"_agg.csv";
DECLARE @out2    string = @outpref+"_top5agg.csv";
@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
        Region,
        SUM(Duration) AS TotalDuration
    FROM @searchlog
GROUP BY Region;
@res =
    SELECT *
    FROM @rs1
    ORDER BY TotalDuration DESC
    FETCH 5 ROWS;
OUTPUT @rs1
    TO @out1
    ORDER BY TotalDuration DESC
    USING Outputters.Csv();
OUTPUT @res
    TO @out2
    ORDER BY TotalDuration DESC
    USING Outputters.Csv();

U-SQL ORDER BY 절에서는 SELECT 식에 FETCH 절을 사용해야 합니다.The U-SQL ORDER BY clause requires using the FETCH clause in a SELECT expression.

U-SQL HAVING 절은 HAVING 조건을 만족하는 그룹으로 출력을 제한하는 데 사용될 수 있습니다.The U-SQL HAVING clause can be used to restrict the output to groups that satisfy the HAVING condition:

@searchlog =
    EXTRACT UserId          int,
            Start           DateTime,
            Region          string,
            Query           string,
            Duration        int?,
            Urls            string,
            ClickedUrls     string
    FROM "/Samples/Data/SearchLog.tsv"
    USING Extractors.Tsv();
@res =
    SELECT
        Region,
        SUM(Duration) AS TotalDuration
    FROM @searchlog
    GROUP BY Region
    HAVING SUM(Duration) > 200;
OUTPUT @res
    TO "/output/Searchlog-having.csv"
    ORDER BY TotalDuration DESC
    USING Outputters.Csv();

고급 집계 시나리오의 경우 U-SQL 참조 설명서에서 집계, 분석 및 참조 기능을 참조하세요.For advanced aggregation scenarios, see the U-SQL reference documentation for aggregate, analytic, and reference functions

다음 단계Next steps