scala - 如何正确迭代 Array[String]?
问题描述
我在 scala 中有一个函数,我向它发送参数,我像这样使用它:
val evega = concat.map(_.split(",")).keyBy(_(0)).groupByKey().map{case (k, v) => (k, f(v))}
我的函数 f 是:
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
implicit val localDateOrdering: Ordering[LocalDate] = Ordering.by(_.toEpochDay)
def f(v: Array[String]): Int = {
val parsedDates = v.map(LocalDate.parse(_, formatter))
parsedDates.max.getDayOfYear - parsedDates.min.getDayOfYear}
这是我得到的错误:
found : Iterable[Array[String]]
required: Array[String]
我已经尝试过使用:
val evega = concat.map(_.split(",")).keyBy(_(0)).groupByKey().map{case (k, v) => (k, for (date <- v) f(date))}
但我得到了大量的错误。
为了获得更好的图片, concat 中的数据是:
1974,1974-06-22
1966,1966-07-20
1954,1954-06-19
1994,1994-06-27
1954,1954-06-26
2006,2006-07-04
2010,2010-07-07
1990,1990-06-30
...
它是 RDD[String] 类型。我怎样才能正确地迭代它并从该函数 f 中获得一个 Int?
解决方案
管道旁边的 RDD 类型是:
concat.map(_.split(","))
给出一个RDD[Array[String]]
- 例如
Array("1954", "1954-06-19")
- 例如
concat.map(_.split(",")).keyBy(_(0))
给RDD[(String, Array[String])]
- 例如
("1954", Array("1954", "1954-06-19"))
- 例如
concat.map(_.split(",")).keyBy(_(0)).groupByKey()
给RDD[(String, Iterable[Array[String]])]
- 例如
Iterable(("1954", Iterable(Array("1954", "1954-06-19"), Array("1954", "1954-06-24"))))
- 例如
因此,当您map
最后时,值的类型是Iterable[Array[String]]
.
由于您的输入是"1974,1974-06-22"
,解决方案可能包括将您的keyBy
转换替换为map
:
input.map(_.split(",")).map(x => x(0) -> x(1)).groupByKey().map{case (k, v) => (k, f(v))}
实际上,.map(x => x(0) -> x(1))
(而不是.map(x => x(0) -> x)
其keyBy(_(0))
语法糖)将为拆分数组的第二个元素而不是数组本身提供值。因此,RDD[(String, String)]
在第二步中给予而不是RDD[(String, Array[String])]
。
推荐阅读
- python-3.x - 比较两个不同 django 模型中的字段
- python - Mypy:dict值的类型不会随着赋值而改变,而变量的类型会改变
- r - 将小于总数 x% 的属性重新分类为“其他”
- python - Python pygame精灵在到达屏幕底部后没有向上移动
- node.js - 我应该在每次查询/插入后打开/关闭数据库连接吗?
- google-apps-script - App Script - 在 SlidesApp 中的表格中获取行高
- cyclomatic-complexity - 了解 McCabe 的圈复杂度
- jquery - 不支持请求方法“POST” 405 错误
- python - 计算图表中节点的所有可能路径
- c++ - 无法理解 C++ 代码注释中的反斜杠