【问题标题】:Scala Array to String, Map[String,Any]Scala数组到字符串,映射[字符串,任何]
【发布时间】:2017-07-28 05:17:25
【问题描述】:

我有一个 scala 数组 "visitedArray",其值如下:

Array(
    (Map(url -> http://www.tumblr.com/tagged/abc), Map(visited -> true)), 
    (Map(url -> http://www.tumblr.com/tagged/random-blog), Map(visited -> true)), 
    (Map(url -> http://www.livestream.com/forum/1),Map(visited -> false))
    ....

但是,我想将其转换为 String, Map[String,Any] 并希望结果如下所示:

(
    (http://www.tumblr.com/tagged/kate-beckett, Map(visited -> true),  
    (http://www.tumblr.com/tagged/random-blog), Map(visited -> true)
    ....

我试过了:

val testRdd = sc.parallelize(visitedArray)
val formatedRdd = testRdd.map(t => (t._1("url"), t._2))

但是,它不会返回所需的格式。它返回:

Array(
    (http://www.tumblr.com/tagged/kate-beckett, Map(visited -> true),  
    (http://www.tumblr.com/tagged/random-blog), Map(visited -> true)
    ....

如何在没有 Array() 的情况下实现我想要的(转换为 String、Map[String,Any]?

【问题讨论】:

  • 你想要一个数组还是一个RDD?
  • 我希望将数组转换为 RDD。 -> 数组到 [String, Map[String,Any]]
  • 我不完全确定您为什么需要 Spark。您是否从其他 RDD 获得这些值?
  • 是的,我从 RDD 获取这些值。我有数百万这样的价值观。以上只是一个例子。
  • 也许我之前不是很清楚,但我想要一个 RDD[String, Map[String,Any]] 或 RDD[String, Map[String,Boolean]]

标签: arrays scala apache-spark rdd


【解决方案1】:

如果我理解正确,你想要这个

  val a = Array(
    (Map("url" -> "http://www.tumblr.com/tagged/abc"), Map("visited" -> true)), 
    (Map("url" -> "http://www.tumblr.com/tagged/random-blog"), Map("visited" -> true)), 
    (Map("url" -> "http://www.livestream.com/forum/1"),Map("visited" -> false)))

  a.map {  
    case (m1: Map[String, String], m2: Map[String, Boolean]) =>
      (m1("url"), m2)
  }

结果是这样的

Array(
  ("http://www.tumblr.com/tagged/abc", Map("visited" -> true)),
  ("http://www.tumblr.com/tagged/random-blog", Map("visited" -> true)),
  ("http://www.livestream.com/forum/1", Map("visited" -> false))
): Array[(String, Map[String, Boolean])]

然后你可以sc.parallelize那个

您只会在开头看到Array,因为这是 Scala 打印对象的方式。它实际上不是“数据的一部分”

例如,使用List

  a.map {  
    case (m1: Map[String, String], m2: Map[String, Boolean]) =>
      (m1("url"), m2)
  } toList

List(
  ("http://www.tumblr.com/tagged/abc", Map("visited" -> true)),
  ("http://www.tumblr.com/tagged/random-blog", Map("visited" -> true)),
  ("http://www.livestream.com/forum/1", Map("visited" -> false))
): scala.package.List[(String, Map[String, Boolean])]

【讨论】:

  • 我需要类似 val newRdd:(String, Map[String,Boolean]) = a.map { case (a: Map[String, String], b: Map[String,Boolean]) => (a("url"), b) } 但这不起作用,因为发现:org.apache.spark.rdd.RDD[(String, Map[String,Boolean]) required: (String, Map[String ,布尔])
  • 您将 Spark API 与 Scala 混淆了...对于 a.map 返回一个 RDD,那么 1) a 本身必须是一个 RDD 2) 您需要在 @987654329 中返回一个 RDD @操作
猜你喜欢
  • 2021-11-15
  • 2012-01-23
  • 2017-01-31
  • 1970-01-01
  • 2021-11-23
  • 2012-08-21
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
相关资源
最近更新 更多