Как использовать подзапрос в U-SQL? - PullRequest
0 голосов
/ 03 июля 2019

Я использую U-SQL для получения смещения даты в соответствии с диапазоном (смещение, начальная дата и конечная дата доступны в другом наборе).

Я пытался использовать подзапрос, но он выдает ошибку.

@partnerships =
    EXTRACT name string,
            createdon DateTime?,
            address1_stateorprovince string
    FROM "/Data/Partnerships"
    USING Extractors.Text(skipFirstNRows : 1, silent : true, quoting : false, delimiter : '\u0001');

@timeZones =
    EXTRACT Year int,
            DateFrom DateTime,
            DateTo DateTime,
            Offset int
    FROM "/Data/ESTTimeZones.csv"
    USING Extractors.Text(skipFirstNRows : 1, silent : true, quoting : false, delimiter : '\u0001');

@output =
    SELECT P.createdon,
           Convert.ToDateTime(P.createdon).AddHours(SELECT Offset from @timeZones  WHERE P.createdon >= T.DateFrom AND P.createdon <= T.DateTo) AS CreatedOn,
           T.Offset AS Offset
    FROM @partnerships AS P;

OUTPUT @output
TO "/Data/PartnershipwithOffset"
USING Outputters.Text(outputHeader : true, quoting : false, delimiter : '\u0001');

У меня есть два файла: один Partnerships, который содержит createdon дату, а другой файл ESTTimeZones, который содержит DateFrom и DateTo со смещением.Я хочу найти смещение, где createdon дата лежит между DateFrom и DateTo.

и добавить это offset в createdOn дату и снова преобразовать эту createdon дату в datetimeoffset сконкретное смещение с использованием U-SQL.

Я пытался найти и добавить смещение определенной createdon даты.Но я получаю синтаксическую ошибку около SELECT Offset (потому что может быть подзапрос недоступен в U-SQL).

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

1 Ответ

0 голосов
/ 03 июля 2019

Вам нужно JOIN ваши наборы строк, а не использовать дополнительный выбор, как вы в настоящее время. Вы всегда должны пытаться найти подход, основанный на множестве, а не применять некоторую логику к каждой строке. Поскольку U-SQL поддерживает только сравнения на равенство в JOIN, вам необходимо создать свой набор данных, включающий все дни между значениями DateFrom и DateTo и предоставить Date версию вашего значения createdon только для JOIN:

@partnerships =
    EXTRACT name string,
            createdon DateTime?,
            address1_stateorprovince string
    FROM "/Data/Partnerships"
    USING Extractors.Text(skipFirstNRows : 1, silent : true, quoting : false, delimiter : '\u0001');

@partnerships =
    SELECT name,
           (DateTime)createdon,
           ((DateTime)createdon).Date AS createdonDate,    // Just the date portion for the JOIN later on
           address1_stateorprovince
    FROM partnerships
    WHERE createdon IS NOT NULL;    // I have assumed this filter is necessary given your nullable input data.

@timeZones =
    EXTRACT Year int,
            DateFrom DateTime,
            DateTo DateTime,
            Offset int
    FROM "/Data/ESTTimeZones.csv"
    USING Extractors.Text(skipFirstNRows : 1, silent : true, quoting : false, delimiter : '\u0001');

@timeZones =
    SELECT Year,
           DateFrom,
           DateTo,
           ((int)(DateTo - DateFrom).TotalDays)) + 1 AS Days,    // Returns the total number of days covered by your date range
           Offset
    FROM @timeZones;

@timeZonesDays =
    SELECT t.Year,
           t.DateFrom,
           t.DateTo,
           t.Offset,
           d.JoinDate
    FROM @timeZones AS t
        CROSS APPLY EXPLODE(Enumerable.Range(0,t.Days)          // Creates a row for each day between each date range
                            .Select(n => t.DateFrom.AddDays(n))
                           ) AS d(JoinDate);

@output =
    SELECT p.createdon,
           p.createdon.AddHours(Offset) AS CreatedOn,
           t.Offset AS Offset
    FROM @partnerships AS p
        JOIN @timeZonesDays AS t
            ON p.createdonDate == t.JoinDate;

OUTPUT @output
TO "/Data/PartnershipwithOffset"
USING Outputters.Text(outputHeader : true, quoting : false, delimiter : '\u0001');
...