spark-dataframe pivot缺少列/值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spark-dataframe pivot缺少列/值相关的知识,希望对你有一定的参考价值。
现在我面临一个我无法解决的问题,让我解释一下。
我需要转动一个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)提供列。
我希望我能很好地解释自己。
答案
Val lscol=Seq((“A”),(“B”),(“C”),(“D”)).toDF(“Type”)
// df是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).show
以上是关于spark-dataframe pivot缺少列/值的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Custom Pivot Model缺少字段
Oracle Pivot 和 Pivot XML - ORA-00918:列定义不明确