Как следует из названия, мне нужно разделить несколько столбцов, разделенных запятыми. Я также хочу выполнить декартово произведение столбцов для каждой строки.
Допустим, исходные данные выглядят так:
| Идентификатор | Имя | Коды_A | Коды_B |
|---|---|---|---|
| 1 | Джордж | 1,2 | 3,4 |
| 2 | Мэри | 5,6 | 7,8 |
Я хотел бы, чтобы результат выглядел примерно так, как показано ниже, где все значения в столбцах, разделенных запятыми, объединяются для каждого возможного результата.
| Идентификатор | Имя | Коды_A | Коды_B |
|---|---|---|---|
| 1 | Джордж | 1 | 3 |
| 1 | Джордж | 1 | 4 |
| 1 | Джордж | 2 | 3 |
| 1 | Джордж | 2 | 4 |
| 2 | Мэри | 5 | 7 |
| 2 | Мэри | 5 | 8 |
| 2 | Мэри | 6 | 7 |
| 2 | Мэри | 6 | 8 |






Вот декартово произведение значений Codes_A и Codes_B.
Я предполагаю, что это то, что вам действительно нужно.
Демонстрационная установка
df = spark.createDataFrame([(1,'George','1,2','3,4'),(2,'Mary','5,6','7,8')],['Id','Name','Codes_A','Codes_B'])
df.show()
+---+------+-------+-------+
| Id| Name|Codes_A|Codes_B|
+---+------+-------+-------+
| 1|George| 1,2| 3,4|
| 2| Mary| 5,6| 7,8|
+---+------+-------+-------+
Решение
import pyspark.sql.functions as F
df_result = (df
.withColumn('Codes_A', F.explode(F.split('Codes_A',',')))
.withColumn('Codes_B', F.explode(F.split('Codes_B',',')))
)
df_result.show()
+---+------+-------+-------+
| Id| Name|Codes_A|Codes_B|
+---+------+-------+-------+
| 1|George| 1| 3|
| 1|George| 1| 4|
| 1|George| 2| 3|
| 1|George| 2| 4|
| 2| Mary| 5| 7|
| 2| Mary| 5| 8|
| 2| Mary| 6| 7|
| 2| Mary| 6| 8|
+---+------+-------+-------+
Спасибо, Дэвид. Я сделал ошибку в примере вывода. Я отредактировал, чтобы он соответствовал надлежащему продукту. Это было именно то, что мне было нужно.
Как вы получаете последние 2 ряда
Georgeи последние 3 рядаMary?