我有一个包含
的PySpark DataFrameRow(id='id1', type='A', status='H', keywords=['k1', 'k2', 'k3'])
状态是二进制选项('S'/'H')。 我需要做的是计算每个类型,id和状态每个关键字的状态 S 的出现率。 比率将是
s/(s+h)
这里出现 s 和 h 。 因此,例如,如果关键字 k1 在S型中出现2次,在 A 中出现3次H,那么我希望在该类型中输入2/3,并且我的最终输出理想情况下是
Row(id='id1', type='A', keyword='k1', ratio=0.66)
我认为这必须通过几个步骤,我很乐意计算S和H中的出现次数,然后创建更多列来比较两者。
但是,在我通过'id','type'和'status'运行 groupBy 后,我将如何计算出现的事件?是否有办法使用自定义函数运行 agg ?
答案 0 :(得分:6)
这样的事情可以解决问题:
from pyspark.sql.functions import explode, avg, col
ratio = avg(
# If status "S" then 1.0 else 0.0
(col("status") == "S").cast("double")
).alias("ratio")
(df
.withColumn("keyword", explode("keywords"))
.groupBy("id", "type", "keyword")
.agg(ratio))