scala - 使用 hashmap 过滤数据帧
问题描述
我有一个存储值的哈希图
Map(862304021470656 -> List(0.0, 0.0, 0.0, 0.0, 1.540980096E9, 74.365111, 22.302669, 0.0),866561010400483 -> List(0.0, 1.0, 1.0, 2.0, 1.543622306E9, 78.0204, 10.005262, 56.0))
这是数据框
| id| lt| ln| evt| lstevt| s| d|agl|chg| d1| d2| d3| d4|ebt|ibt|port| a1| a2| a3| a4|nos|dfrmd|
+---------------+---------+---------+----------+----------+---+---+---+---+---+---+---+---+---+---+----+---+---+---+---+---+-----+
|862304021470656|25.284158|82.435973|1540980095|1540980095| 0| 39|298| 0| 0| 1| 1| 2| 0| 5| 97| 12| -1| -1| 22| 0| 0|
|862304021470656|25.284158|82.435973|1540980105|1540980105| 0| 0|298| 0| 0| 1| 1| 2| 0| 5| 97| 12| -1| -1| 22| 0| 0|
|862304021470656|25.284724|82.434222|1540980155|1540980155| 14| 47|289| 0| 0| 1| 1| 2| 0| 5| 97| 11| -1| -1| 22| 0| 0|
|866561010400483|25.284858|82.433831|1544980165|1540980165| 12| 42|295| 0| 0| 1| 1| 2| 0| 5| 97| 12| -1| -1| 22| 0| 0|
我只想从数据框中过滤这些值,比较 evt 列中列表的第 4 个索引,只选择 evt 值大于列表的第 4 个索引值的行,映射中的键是数据框的 id 列。
解决方案
这是使用 UDF 获取evt
值进行比较的一种方法:
import org.apache.spark.sql.functions._
val df = Seq(
(862304021470656L, 25.284158, 82.435973, 1540980095),
(862304021470656L, 25.284158, 82.435973, 1540980105),
(862304021470656L, 25.284724, 82.434222, 1540980155),
(866561010400483L, 25.284858, 82.433831, 1544980165)
).toDF("id", "lt", "ln", "evt")
val listMap = Map(
862304021470656L -> List(0.0, 0.0, 0.0, 0.0, 1.540980096E9, 74.365111, 22.302669, 0.0),
866561010400483L -> List(0.0, 1.0, 1.0, 2.0, 1.543622306E9, 78.0204, 10.005262, 56.0)
)
def evtLimit(m: Map[Long, List[Double]], evtIdx: Int) = udf(
(id: Long) => m.get(id) match {
case Some(ls) => if (evtIdx < ls.size) ls(evtIdx) else Double.MaxValue
case None => Double.MaxValue
}
)
df.where($"evt" > evtLimit(listMap, 4)($"id")).show
// +---------------+---------+---------+----------+
// | id| lt| ln| evt|
// +---------------+---------+---------+----------+
// |862304021470656|25.284158|82.435973|1540980105|
// |862304021470656|25.284724|82.434222|1540980155|
// |866561010400483|25.284858|82.433831|1544980165|
// +---------------+---------+---------+----------+
请注意,Double.MaxValue
如果提供的 Map 中的键不匹配或值无效,则 UDF 会返回。这当然可以针对特定的业务需求进行修改。
推荐阅读
- swift - 如何在登录页面的 alamofire 中为“错误”设置标识符
- unit-testing - 如何在单参数化测试方法中断言真假
- github-pages - 检索多个策划的 github 存储库
- python - Python:计算一段时间内 Pandas 数据框中的累积量
- python - 有没有办法清理这些奇怪的符号
- apache-kafka - 同步 Kafka 中的中间主题:使用 Spring Request-Reply
- c++ - 你能帮我解决我的递归函数吗?
- php - 从正确时区的文件中获取“最后修改”日期?
- javascript - 如何在 PDF 中嵌入交互式网页?
- python - Python.如何让这个函数返回一个整数而不是一个列表?