首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将RDD[String]拆分为RDD[tuples]

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

Stack Overflow用户
提问于 2019-04-30 14:32:30
回答 3查看 1.4K关注 0票数 0

我是Scala和RDD的初学者。我在Spark2.4上使用Scala。我有一个RDDString,上面有这样的行:

代码语言:javascript
复制
(a, b, c, d, ...)

我想在每次昏迷时把这条线分开,得到一个RDD[(String, String, String, ...)]

显然,下面这样的解决方案对于元素的数量是不可能的。

代码语言:javascript
复制
rdd.map(x => (x.split(",")(0), x.split(",")(1), x.split(",")(2)))

也许有一种方法可以实现自动化?一切都会正常的。

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

非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-30 22:10:20

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

顺便说一句,在第110页的“在行动中的火花”一书中,它写道:

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

代码语言:javascript
复制
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, ...
票数 2
EN

Stack Overflow用户

发布于 2019-04-30 14:56:20

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

代码语言:javascript
复制
val tuples =
  rdd
    .map(line => line.replaceAll("[\\(\\)]", "").split(","))
    .collect {
      case Array(col1, col2, ..., coln) => (col1, col2, ..., coln)
    }
// tuples: RDD[(String, String, ..., String)]
票数 3
EN

Stack Overflow用户

发布于 2019-04-30 15:06:19

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

代码语言:javascript
复制
def parse(s: String) = s.split(",") match {
    case Array(a,b,c) => (a,b,c)
}

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

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

代码语言:javascript
复制
def toTuple[H <: HList](s: String)(implicit ft: FromTraversable[H], t: Tupler[H]) = s.split(",").toHList[H].get.tupled

然后您可以直接使用它:

代码语言:javascript
复制
toTuple[String :: String :: String :: HNil]("x,x,x") // (x,x,x)
toTuple[String :: String :: HNil]("x,x") // (x,x)

或者修复,然后键入并使用它:

代码语言:javascript
复制
def parse3(s: String) = toTuple[String :: String :: String :: HNil](s)

parse3("x,x,x") // (x,x,x)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55923198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档