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缺少字段

PIVOT:行转列函数

Oracle Pivot 和 Pivot XML - ORA-00918:列定义不明确

使用 Pivot 将行更改为列

如何将 SQL 中的列中的值 PIVOT 到新的列名中,然后在这些 PIVOT 列下列出其他列值?

SQL Server - 同一列上的多个 PIVOT