apache-spark-sql - 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)的列。
我希望我能很好地解释自己。
解决方案
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
推荐阅读
- angular - 需要使用 Angular 5/6/7 中的打字稿将小数小时.分钟转换为最接近的四分之一小时
- google-apps-script - 在 Google 工作表的下一个空行上激活 A 列中的单元格
- java - org.springframework.web.client.ResourceAccessException:对“http://localhost:8080/”的 GET 请求出现 I/O 错误:连接被拒绝:连接
- javascript - 如何使用 IF 函数停止 JavaScript 中的所有函数
- javascript - 是什么导致我的简单 JavaScript for-in 循环没有为指定 HTML 元素的背景着色?
- javascript - 非法参数:未定义,字符串(bcrypt)
- mysql - 使用 springboot 和 mysql 进行分片测试
- twitter-bootstrap - 引导按钮不涵盖全文
- gcc - 如何在 Centos7 上配置 GNU Autotools 以编译 32 位程序?
- r - R data.table:将面板中的每个组重新设置为在另一列中找到的值