Поддерживает ли U-SQL извлечение файлов на основе даты создания в ADLS?

Мы знаем, что U-SQL поддерживает сопоставление шаблонов каталогов и имен файлов при извлечении файлов. Что я хотел знать, поддерживает ли он сопоставление с образцом на основе даты создания файла в ADLS (без реализации пользовательских экстракторов).

Скажем, папка содержит файлы, созданные в течение нескольких месяцев (в именах файлов нет даты как части имени файла), есть ли способ получить файлы только за определенный месяц.


person Nasir    schedule 31.12.2016    source источник


Ответы (4)


Оператору U-SQL EXTRACT не известны никакие метаданные (например, дата создания) о файле — только имя файла.

person saveenr    schedule 01.01.2017

Вероятно, вы могли бы создать решение с помощью пакета SDK для .NET. Для чего-то довольно простого вы можете использовать PowerShell для создания файла, который будет содержать все файлы, соответствующие вашим критериям даты и времени. Затем потребляйте контент по желанию.

# Log in to your Azure account
Login-AzureRmAccount

# Modify variables as required
$DataLakeStoreAccount = "<yourDataLakeStoreAccountNameHere>";
$DataLakeAnalyticsAccount = <yourDataLakeAnalyticsAccountNameHere>";
$DataLakeStorePath = "/Samples/Data/AmbulanceData/";  #modify as desired
$outputFile = "Samples/Outputs/ReferenceGuide/filteredFiles.csv";  #modify as desired
$filterDate = "2016-11-22";
$jobName = "GetFiles";

# Query directory and build main body of script.  Note, there is a csv filter.
 [string]$body = 
 "@initial = 
    SELECT * FROM 
    (VALUES
 " +  
(Get-AzureRmDataLakeStoreChildItem -Account $DataLakeStoreAccount -Path $DataLakeStorePath | 
Where {$_.Name -like "*.csv" -and $_.Type -eq "FILE"} | foreach {
 "(""" + $DataLakeStorePath + $_.Name + """, (DateTime)FILE.CREATED(""" + $DataLakeStorePath + $_.Name + """)), `r`n" });

 # formattig, add column names
$body = 
$body.Substring(0,$body.Length-4) + " 
    ) AS T(fileName, createDate);";   

# U-SQL query and OUTPUT statement
[string]$output = 
"

// filter results based on desired time frame
@filtered = 
    SELECT fileName
    FROM @initial
    WHERE createDate.ToString(""yyyy-MM-dd"") == ""$filterDate"";

OUTPUT @filtered
TO ""$outputFile""
USING Outputters.Csv();";

# bring it all together
$script = $body +  $output;

#Execute job
$jobInfo = Submit-AzureRmDataLakeAnalyticsJob -Account $DataLakeAnalyticsAccount -Name $jobName  -Script $script -DegreeOfParallelism 1

#check job progress
Get-AzureRmDataLakeAnalyticsJob -Account $DataLakeAnalyticsAccount -JobId $jobInfo.JobId -ErrorAction SilentlyContinue; 

Write-Host "You now have a list of desired files to check @ " $outputFile
person David Paul Giroux    schedule 13.02.2017

В настоящее время нет способа получить доступ к свойствам метаданных файла или использовать их. Добавьте свой голос и пример использования в следующий элемент отзыва: https://feedback.azure.com/forums/327234-data-lake/suggestions/10948392-support-functionality-to-handle-file-properties-fr

person Michael Rys    schedule 05.01.2017

Прошло некоторое время с тех пор, как был задан этот вопрос, и я не уверен, что это то, что вы искали изначально, но теперь вы можете использовать функцию FILE.MODIFIED U-SQL:

DECLARE @watermark string = "2018-08-16T18:12:03";
SET @@FeaturePreviews="InputFileGrouping:on";

DECLARE @file_set_path string = "adl://adls.azuredatalakestore.net/stage/InputSample.tsv";

@input =
    EXTRACT [columnA] int?,
            [columnB] string
    FROM @file_set_path
    USING Extractors.Tsv(skipFirstNRows : 1, silent : true);

@result =
    SELECT *, FILE.MODIFIED(@file_set_path) AS FileModifiedDate
    FROM @input
    WHERE FILE.MODIFIED(@file_set_path) > DateTime.ParseExact(@watermark, "yyyy-MM-ddTHH:mm:ss", NULL);

OUTPUT @result TO "adl://ADLS.azuredatalakestore.net/stage/OutputSample.tsv" USING Outputters.Tsv(outputHeader:true);

Встроенная функция U-SQL описана здесь: https://msdn.microsoft.com/en-us/azure/data-lake-analytics/u-sql/file-modified-u-sql.

person dim_user    schedule 22.08.2018