将RDD [String]拆分为RDD [tuples]

时间:2019-04-30 14:32:31

标签: scala apache-spark bigdata rdd

我是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)))

可能有一种自动化的方法吗?一切正常。

尽管做出了努力,但到目前为止,我仍然无法解决问题,

非常感谢!

3 个答案:

答案 0 :(得分:3)

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

evaluate

答案 1 :(得分:3)

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

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

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

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

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)

答案 2 :(得分:2)

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

顺便说一句,在 Spark in Action 一书的第 110 页中,它写道:

  

没有将数组转换为元组的优雅方法,因此您必须诉诸此丑陋的表达式:

filter