Подход, показанный в связанном посте, показывает, как обобщить это для произвольных преобразований.
оложим, у меня есть следующий spark-dataframe:
+-----+-------+
| word| label|
+-----+-------+
| red| color|
| red| color|
| blue| color|
| blue|feeling|
|happy|feeling|
+-----+-------+
Который может быть создан с использованием следующего кода:
sample_df = spark.createDataFrame([
('red', 'color'),
('red', 'color'),
('blue', 'color'),
('blue', 'feeling'),
('happy', 'feeling')
],
('word', 'label')
)
Я могу выполнитьgroupBy()
чтобы получить количество каждой пары слово-метка:
sample_df = sample_df.groupBy('word', 'label').count()
#+-----+-------+-----+
#| word| label|count|
#+-----+-------+-----+
#| blue| color| 1|
#| blue|feeling| 1|
#| red| color| 2|
#|happy|feeling| 1|
#+-----+-------+-----+
А потомpivot()
а такжеsum()
чтобы получить метку в виде столбцов:
import pyspark.sql.functions as f
sample_df = sample_df.groupBy('word').pivot('label').agg(f.sum('count')).na.fill(0)
#+-----+-----+-------+
#| word|color|feeling|
#+-----+-----+-------+
#| red| 2| 0|
#|happy| 0| 1|
#| blue| 1| 1|
#+-----+-----+-------+
Каков наилучший способ изменить этоdataframe
так, что каждая строка делится на сумму для этой строки?
# Desired output
+-----+-----+-------+
| word|color|feeling|
+-----+-----+-------+
| red| 1.0| 0.0|
|happy| 0.0| 1.0|
| blue| 0.5| 0.5|
+-----+-----+-------+
Одним из способов достижения этого результата является использование__builtin__.sum
(НЕpyspark.sql.functions.sum
) чтобы получить сумму по ряду, а затем позвонитьwithColumn()
для каждого ярлыка:
labels = ['color', 'feeling']
sample_df.withColumn('total', sum([f.col(x) for x in labels]))\
.withColumn('color', f.col('color')/f.col('total'))\
.withColumn('feeling', f.col('feeling')/f.col('total'))\
.select('word', 'color', 'feeling')\
.show()
Но должен быть лучший способ, чем перечислять каждый из возможных столбцов.
В общем, мой вопрос:
Как я могу применить произвольное преобразование, которое является функцией текущей строки, к нескольким столбцам одновременно?