У меня есть 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
""")