PySpark: перевод кода MSSQL с внутренними объединениями, заявлениями о делах и операторами где - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь скопировать код, написанный на MSSQL, и перевести его на PySpark.Я нуб в PySpark.

Запрос содержит внутренние объединения, встроенные операторы case и несколько операторов where для фильтрации.

SELECT        Table1.Part, Table1.Serial, Table1.AIRCRAFT_NUMBER, Table1.date_removed,
                         Table2.dbo.E15.TIME, Table2.dbo.E15.TSO, data.dbo.EE18.Allowable_Time,
                         CASE WHEN (data.dbo.EE18.Allowable_Time > 0)
                         THEN data.dbo.EE18.Allowable_Time - Table2.dbo.E15.TSO END AS CAL
FROM            Table1 INNER JOIN
                         Table2.dbo.E15 ON Table1.SEQ_ID = Table2.dbo.E15.SEQ_ID AND
                         Table1.Part = Table2.dbo.E15.Part AND
                         Table1.Serial = Table2.dbo.E15.Serial AND
                         Table1.DATE_REMOVED_DESCENDING = Table2.dbo.E15.DATE_REMOVED_DESCENDING INNER JOIN
                         data.dbo.EE18 ON Table2.dbo.E15.Part = data.dbo.EE18.PART_NUMBER AND
                         Table2.dbo.E15.TIME = data.dbo.EE18.TIME
WHERE        (Table1.Part LIKE '18%') AND (Table2.dbo.E15.TIME = 'I') AND
                         (data.dbo.EE18.Allowable_Time > 0) AND (Table2.dbo.E15.TSO <= 2) OR
                         (Table1.Part LIKE '18%') AND (Table2.dbo.E15.TIME = 'T') AND
                         (data.dbo.EE18.Allowable_Time > 0) AND (Table2.dbo.E15.TSO <= 20) OR
                         (Table1.Part LIKE '18%') AND (Table2.dbo.E15.TIME = 'L') AND
                         (data.dbo.EE18.Allowable_Time > 0) AND (Table2.dbo.E15.TSO <= 8)
ORDER BY Table1.date_removed DESC

Как выглядит приведенный выше запрос в коде PySpark?Любая помощь с благодарностью :)

1 Ответ

0 голосов
/ 07 июня 2018

Это не совсем ответ на ваш вопрос, но демонстрирует, насколько чище могут выглядеть ваши запросы при некотором форматировании.Я также немного переработал предикаты where, чтобы избежать избыточности, и исправил логические проблемы с вашей круглой скобкой.

SELECT Table1.Part
    , Table1.Serial
    , Table1.AIRCRAFT_NUMBER
    , Table1.date_removed
    , Table2.dbo.E15.TIME
    , Table2.dbo.E15.TSO
    , data.dbo.EE18.Allowable_Time
    , CASE WHEN (data.dbo.EE18.Allowable_Time > 0) THEN data.dbo.EE18.Allowable_Time - Table2.dbo.E15.TSO END AS CAL
FROM Table1 t1
INNER JOIN Table2.dbo.E15 ON Table1.SEQ_ID = Table2.dbo.E15.SEQ_ID 
                        AND Table1.Part = Table2.dbo.E15.Part 
                        AND Table1.Serial = Table2.dbo.E15.Serial 
                        AND Table1.DATE_REMOVED_DESCENDING = Table2.dbo.E15.DATE_REMOVED_DESCENDING 
INNER JOIN data.dbo.EE18 ON Table2.dbo.E15.Part = data.dbo.EE18.PART_NUMBER 
                        AND Table2.dbo.E15.TIME = data.dbo.EE18.TIME
WHERE Table1.Part LIKE '18%' 
    AND data.dbo.EE18.Allowable_Time > 0 
    AND
    (
        Table2.dbo.E15.TIME = 'I' 
        AND 
        Table2.dbo.E15.TSO <= 2
    )
    OR
    (
        Table2.dbo.E15.TIME = 'T'
        AND
        Table2.dbo.E15.TSO <= 20
    )
    OR
    (
        Table2.dbo.E15.TIME = 'L'
        AND
        Table2.dbo.E15.TSO <= 8
    )
ORDER BY Table1.date_removed DESC
...