2016-07-07 3 views
1

У меня есть два dataframes:Scala Spark - функция Карта ссылок другой dataframe

df1:

+---+------+----+ 
| id|weight|time| 
+---+------+----+ 
| A| 0.1| 1| 
| A| 0.2| 2| 
| A| 0.3| 4| 
| A| 0.4| 5| 
| B| 0.5| 1| 
| B| 0.7| 3| 
| B| 0.8| 6| 
| B| 0.9| 7| 
| B| 1.0| 8| 
+---+------+----+ 

df2:

+---+---+-------+-----+ 
| id| t|t_start|t_end| 
+---+---+-------+-----+ 
| A| t1|  0| 3| 
| A| t2|  4| 6| 
| A| t3|  7| 9| 
| B| t1|  0| 2| 
| B| t2|  3| 6| 
| B| t3|  7| 9| 
+---+---+-------+-----+ 

Мой желаемый результат заключается в определении " t 'для каждой метки времени в df1, где диапазоны' t 'находятся в df2.

df_output:

+---+------+----+---+ 
| id|weight|time| t | 
+---+------+----+---+ 
| A| 0.1| 1| t1| 
| A| 0.2| 2| t1| 
| A| 0.3| 4| t2| 
| A| 0.4| 5| t2| 
| B| 0.5| 1| t1| 
| B| 0.7| 3| t2| 
| B| 0.8| 6| t2| 
| B| 0.9| 7| t3| 
| B| 1.0| 8| t3| 
+---+------+----+---+ 

Мое понимание до сих пор является то, что я должен создать UDF, который принимает столбец 'id и 'time как входы, map для каждой строки, по ссылаюсь на df2.filter(df2.id == df1.id, df1.time >= df2.t_start, df1.time <= df2.t_end), and get the corresponding df2.t`

Я очень новичок в Scala и Spark, поэтому мне интересно, возможно ли это решение?

ответ

1

Вы не можете использовать UDF для этого, но все, что вам нужно сделать, это повторно использовать условие фильтрации вы уже определено присоединиться оба кадра:

df1.join(
    df2, 
    df2("id") === df1("id") && df1("time").between(df2("t_start"), df2("t_end")) 
) 
+0

Так как вы отметили этот вопрос с [тэгом: Scala] '=== 'является правильным оператором. – zero323

+0

Да, вы правы. Я не знал о '===' и думал, что это опечатка. Я исправил его, как у вас, и теперь он работает! - В чем разница между '==' и '==='? –

+0

'===' - это равенство SQL. '==' сравнивает объекты столбцов, что не имеет смысла. – zero323

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