かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Data Lake Analyticsに.NETからクエリを投げる

下準備については1つ前のエントリを参照してください。

blog.okazuki.jp

下準備で作ったプロジェクトに以下のアセンブリをNuGetから追加します(プレリリースで)

  • Microsoft.Azure.Management.DataLake.Analytics

そして下準備のプログラムに以下のような感じのプログラムを追加します。

// data upload
var ms = new MemoryStream();
var sw = new StreamWriter(ms);
sw.WriteLine("taro,12");
sw.WriteLine("jiro,14");
ms.Seek(0, SeekOrigin.Begin);
adlsFileSystemClient.FileSystem.Create("/sample1/data.csv", "Data Lakeストレージのアカウント名", ms, overwrite: true);

// 実行するクエリ
var query = @"
    @src =
        EXTRACT
            Name string,
            Age int
        FROM ""/sample1/data.csv""
        USING Extractors.Csv();
    OUTPUT @src
        TO ""/sample1/output.csv""
        USING Outputters.Csv();";
// init
var adlaClient = new DataLakeAnalyticsAccountManagementClient(tokenCredentials)
{
    SubscriptionId = SubscriptionId
};
var adlaJobClient = new DataLakeAnalyticsJobManagementClient(tokenCredentials)
{
    SubscriptionId = SubscriptionId
};
var adlaCatalogClient = new DataLakeAnalyticsCatalogManagementClient(tokenCredentials)
{
    SubscriptionId = SubscriptionId
};

// add account(これいるのかな?? Createは動かなかった…)
adlaClient.Account.AddDataLakeStoreAccount("datalake",
    "dlsample",
    "dlsampleadls",
    new AddDataLakeStoreParameters(new DataLakeStoreAccountInfoProperties()));

var jobId = Guid.NewGuid();
var properties = new USqlJobProperties(query);
var parameters = new JobInformation("copy", JobType.USql, properties);
var jobInfo = adlaJobClient.Job.Create(jobId, parameters, "Data Lake Analyticsのアカウント名");
while (jobInfo.State != JobState.Ended)
{
    Console.WriteLine($"Waiting... {jobInfo.State}");
    Task.Delay(1000).Wait();
    jobInfo = adlaJobClient.Job.Get(jobId, "Data Lake Analyticsのアカウント名");
}
var jobResult = jobInfo.Result.Value;
Console.WriteLine(jobResult);
Console.ReadKey();