Ниже таблицы будет входной фрейм данных
столбец1 | столбец2 | столбец3 |
---|---|---|
1 | 12;34;56 | Австралия;SL;NZ |
2 | 31;54;81 | Индия; США; Великобритания |
3 | нулевой | Бан |
4 | Нед | нулевой |
Ожидаемый выходной фрейм данных [значения col2 и col3 должны быть разделены на ; соответственно]
столбец1 | столбец2 | столбец3 |
---|---|---|
1 | 12 | Аус |
1 | 34 | СЛ |
1 | 56 | Новая Зеландия |
2 | 31 | инд |
2 | 54 | НАС |
2 | 81 | Великобритания |
3 | нулевой | Бан |
4 | Нед | нулевой |
Вы можете использовать функцию pyspark split()
для преобразования столбца с несколькими значениями в массив, а затем функцию explode()
для создания нескольких строк из разных значений.
Это может выглядеть так:
df = df.withColumn("<columnName>", explode(split(df.<columnName>, ";")))
Если вы хотите сохранить значения NULL, вы можете использовать explode_outer()
.
Если вы хотите, чтобы значения нескольких развернутых массивов совпадали в строках, вы можете работать с posexplode()
, а затем filter()
со строками, в которых позиции соответствуют.
@VineethReddy Я обновил свой ответ возможным решением.
Ниже код работает отлично
data = [(1,'12;34;56', 'Aus;SL;NZ'),
(2,'31;54;81', 'Ind;US;UK'),
(3,None, 'Ban'),
(4,'Ned', None) ]
columns = ['Id', 'Score','Countries']
df = spark.createDataFrame(data, columns)
#df.show()
df2=df.select("*",posexplode_outer(split("Countries",";")).alias("pos1","value1"))
#df2.show()
df3=df2.select("*",posexplode_outer(split("Score",";")).alias("pos2","value2"))
#df3.show()
df4=df3.filter((df3.pos1==df3.pos2) | (df3.pos1.isNull() | df3.pos2.isNull()))
df4=df4.select("Id","value2","value1")
df4.show() #Final Output
@restlessmodern Мне нужно, чтобы значения этих двух столбцов разделялись в соответствии друг с другом. 1-е значение col2 должно быть сопоставлено с 1-м значением col3; 2-е значение col2 должно быть сопоставлено со 2-м значением col3