【问题标题】:Flatten array in row in Scala在 Scala 中按行展平数组
【发布时间】: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


【解决方案1】:

已经解决了:

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

【讨论】:

    猜你喜欢
    • 2014-05-28
    • 2018-11-19
    • 1970-01-01
    • 2022-10-24
    • 2020-08-24
    • 2016-09-06
    • 2017-07-13
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多