将RDD [String]拆分为RDD [元组]

问题描述 投票:0回答:3

我是Scala和RDD的初学者。我在Spark 2.4上使用Scala。我有一个像这样的行的RDD [String]:

(a, b, c, d, ...)

我想在每个昏迷中拆分这个弦来获得一个RDD[(String, String, String, ...)]

关于元素的数量,显然不可能有如下的解决方案。

rdd.map(x => (x.split(",")(0), x.split(",")(1), x.split(",")(2)))

可能有办法实现自动化吗?一切正常都可以。

尽管我付出了努力,但到目前为止我还没有解决我的问题,

非常感谢!

scala apache-spark bigdata rdd
3个回答
2
投票

请注意,最大元组大小限制为22,因此列出它们所需的时间不会太长......

顺便说一下,在第110页的Spark in Action一书中,它表示:

将数组转换为元组没有优雅的方法,所以你必须诉诸这个丑陋的表达:

scala> val itPostsRDD = itPostsSplit.map(x => (x(0), x(1), x(2), x(3), x(4), x(5), x(6), x(7), x(8), x(9), x(10), x(11), x(12))
itPostsRDD: org.apache.spark.rdd.RDD[(String, String, ...

3
投票

如果元素的数量是固定的,您可以执行以下操作:

val tuples =
  rdd
    .map(line => line.replaceAll("[\\(\\)]", "").split(","))
    .collect {
      case Array(col1, col2, ..., coln) => (col1, col2, ..., coln)
    }
// tuples: RDD[(String, String, ..., String)]

3
投票

一种解决方案是只编写映射函数:

def parse(s: String) = s.split(",") match {
    case Array(a,b,c) => (a,b,c)
}

parse("x,x,x") // (x,x,x)

您可以使用无形编写更通用的解决方案:

def toTuple[H <: HList](s: String)(implicit ft: FromTraversable[H], t: Tupler[H]) = s.split(",").toHList[H].get.tupled

然后你可以直接使用它:

toTuple[String :: String :: String :: HNil]("x,x,x") // (x,x,x)
toTuple[String :: String :: HNil]("x,x") // (x,x)

或修复然后键入然后使用它:

def parse3(s: String) = toTuple[String :: String :: String :: HNil](s)

parse3("x,x,x") // (x,x,x)
© www.soinside.com 2019 - 2024. All rights reserved.