scala - Scala比较两个分隔字符串并生成第三个分隔字符串
问题描述
我有两个字符串str1=A#2021-04-02,B#2021-04-01,C#2021-04-02
和str2=A#2021-04-02#60.0,B#2021-04-02#80.0,C#2021-04-01#60.0
.
字符串的第一部分是group
,第二部分是date
。str2
将有一个额外的字段百分比。现在我想通过比较两个字符串来生成一个字符串,比如组部分是否匹配,然后检查日期部分str2
是否大于日期部分str1
和percentage
str2 的部分应该是>= 75
。
输出字符串应该是这样str3=A#2021-04-02,B#2021-04-02,C#2021-04-02
的,因为对于组 Bstr2
的日期大于str1
和percentage >= 75
。
if str1=A#2021-04-02,B#2021-04-01,C#2021-04-02
and str2A#2021-04-02#60.0,B#2021-04-02#60.0,C#2021-04-01#60.0
thenstr3
将是A#2021-04-02,B#2021-04-01,C#2021-04-02
因为百分比部分不 >= 75。
解决方案
def parseString(s: String) = s.split(',').map(_.split('#'))
val str1: String = ???
val str2: String = ???
//Note:
// 1. collect would drop invalid parsed string silently
// 2. we are not parsing date and leaving it as string for simplicity - i.e. we assume all dates are valid string
// 3. `p.toDouble` can fail if p is not a valid double
val rdd1 = sc.parallelize(parseString(str1)).collect { case Array(g, d, _*) => g -> d }
val rdd2 = sc.parallelize(parseString(str2)).collect { case Array(g, d, p, _*) => g -> (d, p.toDouble) }
// 3. we assume a left outer join here base on your requirement to default to the left date if condition fail
val str3 = rdd1.leftOuterJoin(rdd2).map {
case (g, (d1, Some((d2, p)))) if d2 > d1 && p >= 75 => s"$g#$d2"
case (g, (d1, _)) => s"$g#$d1"
}.collect.mkString(",")
推荐阅读
- c++ - 如何使用 CMake 对库 (TDD) 的私有功能进行单元测试
- awk - 删除选项卡文件中的模式
- angular - 如何有条件地做 retryWhen on action click from小吃栏动作Angular 7.x
- javascript - wordpress 中的内容窃取:如果浏览器禁用了 javascript,则重定向
- laravel - 如何在 Laravel Eloquent 中使用联合查询?
- ruby - Ruby,使用 if/else 迭代多值哈希,尝试返回键/值对,当找不到值时失败
- python - 如何在命名元组中删除键并仅打印数据?
- dart - 如何在 Dart 中检查 2 个 IP 是否属于同一个网络?
- r - R Shiny 自动开始下载
- python - 日志文件监控,直到在日志文件中找到特定字符串