【发布时间】:2019-06-23 15:26:33
【问题描述】:
我在 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)
但出现错误
【问题讨论】:
-
你可以用 Shapeless 做这样的事情,但它会很乱。在我看来,你几乎肯定最好写出这些值,即使你有几十个。
-
出于兴趣,你为什么想要一个有 50 个元素的元组而不是某种集合?
标签: scala apache-spark tuples flatten flatmap