Как создать фрейм данных на основе фрейма данных поиска и создать несколько столбцов для динамических и сопоставленных значений в определенных столбцах

#python #arrays #apache-spark #pyspark #apache-spark-sql

Вопрос:

У меня есть два фрейма данных, один из которых основной, а другой-фрейм данных поиска. Мне нужно выполнить третий в настроенной форме, используя pyspark. Мне нужно проверить значения в столбце list_ids и проверить соответствие во фрейме данных поиска и отметить количество в конечном фрейме данных. Я пробовал пересекать массивы и искать массивы, но это не работает.

Основной фрейм данных:

 df = spark.createDataFrame([(123, [75319, 75317]), (212, [136438, 25274]), (215, [136438, 75317])], ("ID", "list_IDs"))
df.show()

 --- --------------- 
| ID|       list_IDs|
 --- --------------- 
|123| [75319, 75317]|
|212|[136438, 25274]|
|215|[136438, 75317]|
 --- --------------- 
 

Фрейм данных поиска:

 df_2 = spark.createDataFrame([(75319, "Wheat", 20), (75317, "Rice", 10), (136438, "Jowar", 30), (25274, "Rajma", 40)], ("ID", "Material", "Count"))
df_2.show()

 ------ -------- ----- 
|    ID|Material|Count|
 ------ -------- ----- 
| 75319|   Wheat|   A|
| 75317|    Rice|   B|
|136438|   Jowar|   C|
| 25274|   Rajma|   D|
 ------ -------- ----- 
 

Нужен результирующий кадр данных, как

  --- --------------- ------ ------ ------- ------ 
| ID|       list_IDs|Wheat | Rice | Jowar | Rajma|
 --- --------------- ------ ------ ------- ------ 
|123| [75319, 75317]|    A|    B|    0 |     0|
|212|[136438, 25274]|    0|    0|    C |     D|
|215|[136438, 75317]|    0|    B|    C |    0 |
 --- --------------- ------ ------ ------- ------ 
 

Ответ №1:

Вы можете соединить два кадра данных, а затем повернуть:

 import pyspark.sql.functions as F

df2 = df.join(
    df_2, 
    F.array_contains(df.list_IDs, df_2.ID)
).groupBy(df.ID, 'list_IDs').pivot('Material').agg(F.first('Count')).fillna(0)

result.show()
 --- --------------- ----- ----- ---- ----- 
| ID|       list_IDs|Jowar|Rajma|Rice|Wheat|
 --- --------------- ----- ----- ---- ----- 
|212|[136438, 25274]|   30|   40|   0|    0|
|215|[136438, 75317]|   30|    0|  10|    0|
|123| [75319, 75317]|    0|    0|  10|   20|
 --- --------------- ----- ----- ---- -----