spark-dataframe数据透视表缺少列/值

时间:2018-08-31 09:51:06

标签: apache-spark-sql pivot missing-data dynamic-columns

现在我正面临一个无法解决的问题,让我解释一下。

我需要旋转一个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)的列。

我希望自己能很好地解释自己。

1 个答案:

答案 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