Чтение из определенных файлов на U-SQL - PullRequest
0 голосов
/ 23 сентября 2018

Я новичок в U-SQL и начал запрашивать файлы.На основании инструкций, которые я видел в документации и здесь о переполнении стека, у меня есть письменный запрос для извлечения метаданных из набора файлов json, как показано ниже.

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

USING Microsoft.Analytics.Samples.Formats.Json;

DECLARE @InputFile string = "/test/{*}.json";
DECLARE @OutputFile string = "/metadata.csv";

@json =
EXTRACT
        id string,
        date DateTime,
        type string,
        uri = FILE.URI()
      , modified_date = FILE.MODIFIED()
      , created_date = FILE.CREATED()
      , file_sz = FILE.LENGTH()
FROM
    @InputFile
USING new JsonExtractor();

@json2 =
    SELECT 
    uri
    modified_date,
    created_date,
    file_sz
FROM @json;

@json3 =
    SELECT DISTINCT uri,
    modified_date,
    created_date,
    file_sz

    FROM @json2;
OUTPUT @json3
TO @OutputFile
USING Outputters.Csv(outputHeader:true,quoting:true);
DROP ASSEMBLY [Newtonsoft.Json];
DROP ASSEMBLY [Microsoft.Analytics.Samples.Formats];

Это генерирует необходимые метаданные (я запускаюэто на портале Azure, даже если здесь расположение относительно)

Мои вопросы:

1) Как мы можем использовать значения из столбца (столбца имен файлов) из внутренней таблицы / файлакак список путей к файлам для ввода?

2) Как мы можем добавить новые данные в существующий файл и обновить файл метаданных списком новых файлов.

Мои метаданные выглядят так:

uri           created_date       modified_date   file_sz
/…/abc.json      09-22-2018        09-23-2018       250
/…/del.json      09-24-2018        09-24-2018       126

ОЖИДАЕМЫЙ ВЫХОД (если возможно)

@filespresent =
SELECT uri
FROM @metadata

DECLARE @Inputfile string = @filespresent

Основная цель этого - каждый день получать новый пакет файлов и хочу читать только те файлы, которые были загружены сегодня.

Имя файла не содержит даты, и единственный способ извлечь информацию о дате - это найти внутри файла.Я извлекаю метаданные в отдельном запросе, а затем запускаю основное задание для файлов, выбранных из файла метаданных.

Если есть и другие обходные пути, они также приветствуются.

Любая помощьценится.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Функции, которые вы хотели бы (например, чтение путей из файла и добавление к существующему файлу), недоступны.

Добавление к файлу, который вы можете сделать, прочитав файл, объединяя новыеданные, а затем записать результат в тот же файл.

Однако, взглянув на ваш сценарий ** Основная цель этого заключается в том, чтобы я каждый день получал новый пакет файлов и хочу читать только файлыкоторые были загружены сегодня.**

Вы можете сделать EXTRACT, как указано выше, а затем поместить фильтр в столбец created_date или modified_date, чтобы выбрать только файлы, созданные или измененные на конкретную дату.Например (набирается в stackoverflow),

DECLARE EXTERNAL @last_processed_modified_date = DateTime.Now();

@json = EXTRACT
    id string,
    date DateTime,
    type string,
    uri = FILE.URI()
  , modified_date = FILE.MODIFIED()
  , created_date = FILE.CREATED()
  , file_sz = FILE.LENGTH()
FROM @InputFile
USING new JsonExtractor();

@json = SELECT * FROM @json WHERE modified_date > @last_processed_modified_date;

…
0 голосов
/ 24 сентября 2018

Это ограничение на данный момент.Вы можете проголосовать здесь за эту функцию.Также здесь указывается та же самая проблема .

Единственный способ обойти это - запустить скрипт u-sql с powershell, который внедряет внешнюю переменную, подобную этой:

DECLARE EXTERNAL @InputFile string = "/Input/sample{n}.json";

Если вы попытаетесь запустить это, вы получите ошибку «Rowset variable не является скалярной переменной» ...

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

USING Microsoft.Analytics.Samples.Formats.Json;

DECLARE @InputFile string = "/Input/sample4.json";
DECLARE @OutputFile1 string = "/Output/metadata1.csv";
DECLARE @OutputFile2 string = "/Output/metadata2.csv";
DECLARE @OutputFile3 string = "/Output/metadata3.csv";

@json1 =
EXTRACT
        // Json fields
        id string,   
        file string,
        // Virtual columns
        n string,
        uri = FILE.URI()
      , modified_date = FILE.MODIFIED()
      , created_date = FILE.CREATED()
      , file_sz = FILE.LENGTH()
FROM
    @InputFile // This file has a file set within
USING new JsonExtractor();

OUTPUT @json1
TO @OutputFile1
USING Outputters.Csv(outputHeader:true,quoting:true);

@json2 =
    SELECT 
    file
FROM @json1;

OUTPUT @json2
TO @OutputFile2
USING Outputters.Csv(outputHeader:true,quoting:true);

@json3 =
EXTRACT
        // Json fields
        id string,   
        file string,
        // Virtual columns
        n string,
        uri = FILE.URI()
      , modified_date = FILE.MODIFIED()
      , created_date = FILE.CREATED()
      , file_sz = FILE.LENGTH()
FROM
    @json2 // This is a rowset variable (with our fileset)
USING new JsonExtractor();

OUTPUT @json3
TO @OutputFile3
USING Outputters.Csv(outputHeader:true,quoting:true);
...