现在我面临着一个我无法解决的问题,让我来解释一下。
我需要透视一个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)的列。
我希望我已经解释得很清楚了。
发布于 2018-08-31 23:43:00
val lscol = Seq((“A”),(“B”),(“C”),(“D”)).toDF(“Type”)
//df is the initial dataframe prior to pivot
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)
.showhttps://stackoverflow.com/questions/52112830
复制相似问题