pyspark.sql.utils.ParseException: u "\ nextraneous> ввод 'xxx' ожидая {')', ','} - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть 2 основные таблицы: рейсы и праздники.

Полеты идентифицируются по: outboundlegid, inboundlegid, agent, querydatetime.Дополнительные столбцы, применимые к вопросу, out_date, in_date.Они указывают, когда рейс отправляется и дату возвращения.

И праздничные дни с колонками start, end, type

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

Я последовал некоторому предложению PySpark: как добавить столбцы, данные которых поступают из запроса (аналогично подзапросу для каждой строки) , чтобы определить, пересекаются ли даты выхода / выхода с каким-либо праздником.

Однако я получаю: "pyspark.sql.utils.ParseException: u" \ nextraneous

input 'outboundlegid' Ожидающий {')', ','} (строка35, поз. 12) ". Что здесь не так?

Файл" script_2019-02-08-10-46-14.py ", строка 182, в файле" "") "/ mnt / yarn / usercache/root/appcache/application_1549622095592_0002/container_1549622095592_0002_01_000001/pyspark.zip/pyspark/sql/session.py "строка 603, в SQL File" /mnt/yarn/usercache/root/appcache/application_1549622095592_0002/container_1549622095592_0002_01_000001/py4j-0.10.4-src.zip/py4j/java_gateway.py ", строка 1133, в вызов Файл" /mnt/yarn/usercache/root/appcache/application_1549622095592_0002/container_1549622095592_0002_01_000001/pyspark.zp.", строка 73, в файле deco pyspark.sql.utils.ParseException: u" \ следующий постранный ввод 'outboundlegid' ожидающий {')', ','} (строка 35, позиция 12) \ n \ n == SQL == \n \ n WITH t (\ n SELECT \ n f.outboundlegid, \ n f.inboundlegid, \ n f.agent, \ n f.querydatetime, \ n CASE WHEN type = 'HOLIДЕНЬ 'И (out_date МЕЖДУ началом и концом) \ n ТО истина \ n Иначе false \ n КОНЕЦ out_is_holiday, \ n СЛУЧАЙ, КОГДА type =' LONG_WEEKENDS 'И (out_date МЕЖДУ началом и концом) \ n ТОГДА true \ n Иначе false \ nEND out_is_longweekends, \ n CASE, КОГДА type = 'HOLIDAY' И (in_date МЕЖДУ началом и концом) \ n THEN true \ n ELSE false \ n END in_is_holiday, \ n CASE WHEN type = 'LONG_WEEKENDS' AND (in_date BETWEEN end and end)\ nТогда true \ n Иначе false \ n КОНЕЦ in_is_longweekends \ n ИЗ ПОЛЕТОВ f \ n КРЕСТНЫЕ СОБЫТИЯ СОЕДИНЕНИЯ h \ n) \ n ВЫБРАТЬ \ n f. *, \ n t1.out_is_holiday, \ n t1.out_is_longweekends, \ n t1.in_is_holiday, \ n t1.in_is_longweekends, \ n ОТ (\ n ВЫБРАТЬ \ n outboundlegid, \ n ------------ ^^^ \ n inboundlegid, \ n агент, \ n время запроса, \ nn СЛУЧАЙ, КОГДА array_contains (collect_set (out_is_holiday), true) \ n THEN true \ n ELSE false \ n END out_is_holiday, \ n CASE WHEN array_contains (collect_set (out_is_longweekends), true) \ n THEN true \ n ELSE false \ n END out_is_longwe, \ n СЛУЧАЙ, КОГДА Массив_содержит (collect_set (in_is_holiday), true) \ n ТОЛЬКО true \ n ELSE false \ n КОНЕЦ in_is_holiday, \ n СЛУЧАЙ, КОГДА Массив_содержит (collect_set (in_is_longweekends), true) \ n THEN true \ n ELSE false \ n

В чем здесь проблема?

resultDf = spark.sql("""
    WITH t (
        SELECT  
            f.outboundlegid,
            f.inboundlegid,
            f.agent,
            f.querydatetime,
            CASE WHEN type = 'HOLIDAY' AND (out_date BETWEEN start AND end)
                THEN true
                ELSE false
                END out_is_holiday,
            CASE WHEN type = 'LONG_WEEKENDS' AND (out_date BETWEEN start AND end)
                THEN true
                ELSE false
                END out_is_longweekends,
            CASE WHEN type = 'HOLIDAY' AND (in_date BETWEEN start AND end)
                THEN true
                ELSE false
                END in_is_holiday,
            CASE WHEN type = 'LONG_WEEKENDS' AND (in_date BETWEEN start AND end)
                THEN true
                ELSE false
                END in_is_longweekends
        FROM flights f
        CROSS JOIN holidays h
    )
    SELECT 
        f.*,
        t1.out_is_holiday,
        t1.out_is_longweekends,
        t1.in_is_holiday,
        t1.in_is_longweekends,
    FROM (
        SELECT 
            outboundlegid,   # <<< I am guessing something wrong with this? But Why?
            inboundlegid,
            agent,
            querydatetime,
            CASE WHEN array_contains(collect_set(out_is_holiday), true)
                THEN true
                ELSE false
                END out_is_holiday,
            CASE WHEN array_contains(collect_set(out_is_longweekends), true)
                THEN true
                ELSE false
                END out_is_longweekends,
            CASE WHEN array_contains(collect_set(in_is_holiday), true)
                THEN true
                ELSE false
                END in_is_holiday,
            CASE WHEN array_contains(collect_set(in_is_longweekends), true)
                THEN true
                ELSE false
                END in_is_longweekends
        FROM t
        GROUP BY 
            querydatetime, 
            outboundlegid,
            inboundlegid,
            agent
        LIMIT 100000
    ) t1
    INNER JOIN flights f
    ON t1.querydatetime = f.querydatetime
    AND t1.outboundlegid = f.outboundlegid
    AND t1.inboundlegid = f.inboundlegid
    AND t1.agent = f.agent
    INNER JOIN agents a
    ON f.agent = a.id
    INNER JOIN airports p
    ON f.querydestinationplace = p.airportId
""")
...