Есть ли способ написать U-SQL запросов без использования EXTRACT - PullRequest
0 голосов
/ 16 мая 2019

У меня есть вывод активности метаданных, который представляет собой json больших двоичных объектов в моем контейнере. Я хочу ввести эти имена в мое действие foreach, где некоторый запрос u-sql выполняется к BLOB-объекту в соответствии с именем файла. Возможно ли это?

1 Ответ

1 голос
/ 20 мая 2019

Вам необходимо указать либо SELECT, либо EXTRACT. Поскольку вы извлекаете файлы, вы захотите использовать EXTRACT.

Если я правильно понимаю ваш вопрос, вы хотите запускать различные сценарии U-SQL на основе имени файла.

Есть несколько способов сделать это:

1) использовать условия If в фабрике данных для вызова различных сценариев U-SQL на основе имени файла. Вложение операторов if позволит вам иметь более двух вариантов. Есть несколько функций для работы со строками , которые помогут вам в этом. Скажем, один путь - @item.Contains('a').

{
    "name": "<Name of the activity>",
    "type": "IfCondition",
    "typeProperties": {
            "expression":  {
                 "value":  "@item() == <file name>", 
                 "type": "Expression"
             }
            "ifTrueActivities": [
            {
                "<U-SQL script = 1>"
            }
        ],

        "ifFalseActivities": [
            {
                "<U-SQL script 2>"
            }
            ]
    }
}

2) Второй вариант - использовать один скрипт U-SQL и выполнить разделение оттуда. Опять же, функции управления строками могут помочь с помощью сопоставления с образцом. В этом есть некоторое преимущество, поскольку организация может хранить уникальные сценарии в хранимых процедурах, а сценарий U-SQL просто проверяет переданное имя файла и вызывает соответствующий хранимый процесс.

//This would be added by data factory
DECLARE @fileName = "/Samples/Data/SearchLog.tsv";

IF @fileName == "/Samples/Data/SearchLog.tsv"
THEN
    @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 @fileName
    USING Outputters.Csv();

ELSE
    @searchlog =
        EXTRACT UserId int,
                Start DateTime,
                Region string,
                Query string,
                Duration int?,
                Urls string,
                ClickedUrls string
        FROM @fileName
        USING Extractors.Tsv();

    OUTPUT @searchlog
    TO "/output/SearchLogResult1.csv"
    USING Outputters.Csv();
END;

Нужно подумать о том, что Data Lake Analytics будет более эффективна, если вы сможете объединить несколько файлов в один оператор. Вы можете иметь несколько операторов EXTRACT и OUTPUT. Я бы посоветовал вам изучить возможность использования сопоставления с образцом в ваших операторах EXTRACT для разделения обработки U-SQL без необходимости использования цикла foreach в фабрике данных.

...