Scala 如何正确迭代数组[字符串]?

Scala 如何正确迭代数组[字符串]?,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我在scala中有一个函数,我将参数发送给它,我使用它的方式如下: val evega=concat.map(u.split(“,”).keyBy((0)).groupByKey().map{case(k,v)=>(k,f(v))} 我的职能是: val formatter=DateTimeFormatter.of模式(“yyyy-MM-dd”) 隐式val localDateOrdering:Ordering[LocalDate]=Ordering.by(u.toEpochDay) def(

我在scala中有一个函数,我将参数发送给它,我使用它的方式如下:

val evega=concat.map(u.split(“,”).keyBy((0)).groupByKey().map{case(k,v)=>(k,f(v))}
我的职能是:

val formatter=DateTimeFormatter.of模式(“yyyy-MM-dd”)
隐式val localDateOrdering:Ordering[LocalDate]=Ordering.by(u.toEpochDay)
def(v:Array[String]):Int={
val parsedDates=v.map(LocalDate.parse(551;,格式化程序))
parsedDates.max.getDayOfYear-parsedDates.min.getDayOfYear}
这就是我得到的错误:

found:Iterable[Array[String]]
必需:数组[字符串]
我已经尝试使用:


val evega=concat.map(u.split(“,”).keyBy((0)).groupByKey().map{case(k,v)=>(k,for(date管道旁边的RDD类型是:

  • concat.map(u.split(“,”)
    给出了一个
    RDD[Array[String]]
    • 例如
      数组(“1954”、“1954-06-19”)
  • concat.map(0.split(“,”).keyBy(0))
    给出
    RDD[(字符串,数组[String])]
    • 例如
      (“1954”,数组(“1954”,“1954-06-19”)
  • concat.map(u.split(“,”).keyBy((0)).groupByKey()给出
    RDD[(字符串,Iterable[Array[String]])]]
    • 例如
      Iterable((“1954”,Iterable(数组(“1954”,“1954-06-19”),数组(“1954”,“1954-06-24”))
因此,当您在末尾映射时,值的类型是
Iterable[Array[String]]

由于您的输入是
“19741974-06-22”
,解决方案可能包括用
映射替换
keyBy
转换:

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(u(0))
是语法糖)将提供分割数组的第二个元素的值,而不是数组本身。因此在第二步中提供
RDD[(String,String)]
[(字符串,数组[String])]

你能提供一些示例数据吗?如果人们知道你正在处理的数据的格式,这将更容易回答。具体来说,就是
concat
的内容结构。实际上,你可以将
v
转换为
数组
v.toArray
。但是,你的函数访问可能更安全pt是一个可以避免内存不足的问题。我已经尝试过了,我得到了这个错误:org.apache.spark.SparkException:Task not serializable这是另外一个问题,在解决了第一个问题之后,下一个要解决的问题;现在代码编译到调用
f
。它很可能来自您使用的。是的,您将无法在您的repl上应用此操作。在运行时,当您在驱动程序上初始化变量,然后尝试在其中一个辅助进程上使用它时,会发生这种情况。如果需要,请打开一个新问题,因为它与此问题的初始问题相去甚远。