2016-12-16 4 views
1

Я хочу присоединиться к двум файлам данных на основе оператора case SQL, как показано ниже. Скажите, пожалуйста, какой подход лучше всего подходит для этой ситуации?PySpark Присоединиться к случаю statemnet

from df1 
    left join df2 d 
     on d."Date1" <= Case when v."DATE2" >= v."DATE3" then df1."col1" else df1."col2" end 

ответ

0

Лично я бы поместил его в UDF, который возвращает логическое значение. Поэтому бизнес-логика будет в конечном итоге в коде Python и SQL будет оставаться чистым:

>>> from pyspark.sql.types import BooleanType 

>>> def join_based_on_dates(left_date, date0, date1, col0, col1): 
>>>  if(date0 >= date1): 
>>>   right_date = col0 
>>>  else: 
>>>   right_date = col1 
>>>  return left_date <= right_date 

>>> sqlContext.registerFunction("join_based_on_dates", join_based_on_dates, BooleanType()) 

>>> join_based_on_dates("2016-01-01", "2017-01-01", "2018-01-01", "res1", "res2"); 
True 

>>> sqlContext.sql("SELECT join_based_on_dates('2016-01-01', '2017-01-01', '2018-01-01', 'res1', 'res2')").collect(); 
[Row(_c0=True)] 

Вашего запрос будет в конечном итоге что-то вроде:

FROM df1 
LEFT JOIN df2 ON join_based_on_dates('2016-01-01', '2017-01-01', '2018-01-01', 'res1', 'res2') 

Надеется, что это помогает, весело провести время с искрой!

Смежные вопросы