现在我正面临一个无法解决的问题,让我解释一下。
我需要旋转一个spark-dataframe,但是在某些情况下,没有任何记录可以包含我需要的列。这是一个示例:
假设事件有4种:A,B,C,D
我收到这样的事件日志文件:
|Id|year|type|
|--|----|----|
|a |2015| A|
|a |2016| A|
|a |2015| A|
|a |2017| A|
|b |2015| A|
|b |2015| B|
|b |2016| D|
|b |2015| B|
|b |2017| A|
当我执行枢轴操作时,我得到:
|id|year| A| B| D|
|--|----|----|----|----|
|a |2015| 2|null|null|
|a |2016| 1|null|null|
|a |2017| 1|null|null|
|b |2015| 1| 2|null|
|b |2016| 1|null| 1|
|b |2017| 1|null|null|
我真正需要的是:
|id|year| A| B| C| D|
|--|----|----|----|----|----|
|a |2015| 2| 0| 0| 0|
|a |2016| 1| 0| 0| 0|
|a |2017| 1| 0| 0| 0|
|b |2015| 1| 2| 0| 0|
|b |2016| 1| 0| 0| 1|
|b |2017| 1| 0| 0| 0|
想象一下,在我收到的每个事件日志文件中,都有不同类型的事件丢失,但是我始终需要具有所有事件类型(A,B,C和D)的列。
我希望自己能很好地解释自己。
答案 0 :(得分:2)
Val lscol=Seq((“A”),(“B”),(“C”),(“D”)).toDF(“Type”)
// df是数据透视之前的初始数据帧
df.join(lscol,df.col(“Type”)===lscol.col(“Type”),”right”).drop(df(“Type”)).groupBy(“ID”,”year”).pivot(“Type”).agg(count(“Type”)).filter(!col(“ID”).isNull && !col(“year”).isNull).na.fill(0).show