Как заполнить значения Dataframe на основе данных в другом dataframe - PullRequest
0 голосов
/ 02 июня 2018

Lookup DF:

+--------------------+------------------+
|         seller_name|             codes|
+--------------------+------------------+
|           BlueR    |[5944, 5813, 5812]|
|           jack     |[4814, 5734, 5968]|
|         Cwireless  |[7349, 7399, 5999]|
|            Tea     |[4899, 5813, 8398]|

Base DF:

seller_name       | raw_code
    BlueR         | 5813
    jack          | 5968
    Cwireless     | 7865
    Tea           | 5999
    Tea           | 5813
    blueR         | 5678
    jack          | 9999
    Tea           | null

Если seller_name в BaseDF присутствует в LookUp data frame, и если raw_code изseller_name из Base DF присутствует в Lookup DF codes, тогда я должен сохранить то же значение, но если значение raw_code отличается от элементов в кортеже LookUp DF, чем raw_codeзначение должно быть заменено первым элементом в кортеже для этого продавца.

edit:, если seller_name из base_df отсутствует в lookup df, чем значение raw_code должно быть сохраненокак есть.

Ожидаемый выходной DF:

seller_name   | revised_code
blueR         | 5813
jack          | 5968
Cwireless     | 7349
Tea           | 4899
Tea           | 5813
blueR         | 5678
jack          | 4814
Tea           | 4899

Как я могу реализовать эту функцию?

1 Ответ

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

Передача левого соединения lookUpDf и left с baseDf , а затем использование функции udf, чтобы проверить, содержится ли raw_code в codes, если оно возвращаетraw_code еще первое значение массива codes.

import org.apache.spark.sql.functions._
def retainUdf = udf((rawCode: Int, codes:Seq[Int]) => if(codes == null || codes.isEmpty) rawCode else if(codes.contains(rawCode)) rawCode else codes.head)

baseDf.join(broadcast(lookUpDf), Seq("seller_name"), "left")
  .select(col("seller_name"), retainUdf(col("raw_code"), col("codes")).as("raw_code"))

, которое должно дать вам

+-----------+--------+
|seller_name|raw_code|
+-----------+--------+
|BlueR      |5813    |
|jack       |5968    |
|Cwireless  |7349    |
|Tea        |4899    |
|Tea        |5813    |
|blueR      |5678    |
|jack       |4814    |
+-----------+--------+

Надеюсь, ответ полезен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...