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