#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|
--- --------------- ----- ----- ---- -----