我在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)
但出现错误
答案 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):_ *)