在Scala中将数组展平

时间:2019-01-30 11:02:27

标签: scala apache-spark tuples flatten flatmap

我在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)

但出现错误

1 个答案:

答案 0 :(得分:0)

已经解决了一个问题:

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):_ *)