在 Scala 中按行展平数组

Flatten array in row in Scala

我在 Scala 中有这样的 Spark 代码:

scala> myfile.filter(!_.contains("BatchNumber")).map(line=>line.split("\t")).map(line=>Row(line(0),(for (i <- 30 to 33) yield line(i)),line(1))).take(2)

上面代码的结果如下,这不是我想要的

res85: Array[org.apache.spark.sql.Row] = Array([C002,Vector(323.000, 0.000, 0.000, 323.000),2RFG], [C002,Vector(33.000, 0.000, 0.000, 33.000),2RFG])

我想要的是:

Array([C002,323.000, 0.000, 0.000, 323.000.2RFG], [C002,33.000, 0.000, 0.000, 33.000,2RFG])

我知道我下面的代码有效,但这不是我想要的

myfile.filter(!_.contains("BatchNumber")).map(line=>line.split("\t")).map(line=>Row(line(0), line(30),line(31),line(32),line(33),line(1))).take(2)

因为在现实世界中,我有大约 50 列,我不想在代码中列出它们

myfile.filter(!_.contains("BatchNumber")).map(line=>line.split("\t")).map(line=>Row(line(0),(for (i <- 30 to 50) yield line(i)),line(1))).take(2)

我在下面的代码中尝试了 flatMap:

scala> myfile.filter(!_.contains("BatchNumber")).map(line=>line.split("\t")).flatMap(line=>Row(line(0),(for (i <- 30 to 33) yield line(i)),line(1))).take(2)

但出现错误

已经解决了:

myfile.map(line=>line.split("\t")).map(line=>Row((for (i<-0 to 33 if (i==0) ||  ((i>=30) && (i<=33)) || (i==1)) yield{if (i==30) line(i).toDouble else line(i)}):_*))

原来我需要首先产生这样格式的所有结果:Vector(C002,323.000,0.000,0.000,323.000,2RFG),然后做这样的事情:Row(Vector(C002,323.000,0.000,0.000 ,323.000,2RFG):_*)