spark-dataframe pivot缺少列/值

问题描述 投票:1回答:1

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

我需要转动一个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)提供列。

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

apache-spark-sql pivot missing-data dynamic-columns
1个回答
2
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.