首页 > 解决方案 > spark-dataframe 透视缺失的列/值

问题描述

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

我需要转置一个 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-sqlpivotmissing-datadynamic-columns

解决方案


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)
    .show

推荐阅读