scala - 从Spark RDD提取值

标签 scala hadoop apache-spark bigdata

RDDData===RET
(
  12345,
  20170201,
  Map(12 -> 85, 15 -> 57, 00 -> 3, 09 -> 80, 21 -> 33, 03 -> 7, 18 -> 50, 06 -> 38, 17 -> 43, 23 -> 28, 11 -> 73, 05 -> 16, 14 -> 58, 08 -> 66, 20 -> 35, 02 -> 9, 01 -> 16, 22 -> 34, 16 -> 49, 19 -> 53, 10 -> 69, 04 -> 15, 13 -> 66, 07 -> 43),
  Map(12 -> 4, 15 -> 4, 00 -> 4, 09 -> 4, 21 -> 4, 03 -> 4, 18 -> 4, 06 -> 4, 17 -> 4, 23 -> 4, 11 -> 4, 05 -> 4, 14 -> 4, 08 -> 4, 20 -> 4, 02 -> 4, 01 -> 4, 22 -> 4, 16 -> 4, 19 -> 4, 10 -> 4, 04 -> 4, 13 -> 4, 07 -> 4),
  Map(12 -> 15, 15 -> 9, 00 -> 4, 09 -> 14, 21 -> 8, 03 -> 4, 18 -> 8, 06 -> 8, 17 -> 9, 23 -> 8, 11 -> 15, 05 -> 4, 14 -> 9, 08 -> 12, 20 -> 8, 02 -> 4, 01 -> 5, 22 -> 8, 16 -> 9, 19 -> 9, 10 -> 14, 04 -> 5, 13 -> 13, 07 -> 9)
)

我是新手,也不知道从哪里开始。我有一个如上所述的rdd。您能帮我从上述RDD中提取值吗?

我想提取值并根据键将 map 加入第三,第四和第五列。

谢谢您的帮助

最佳答案

您可以尝试这样:

rdd.map{case(id, data, map3, map4, map5) => 
            map3.toList ++ map4.toList ++ map5.toList
       }
   .map(l => l.groupBy(_._1).map{case(k, v) => k -> v.map(_._2).toSeq)

第一个 map 功能将仅保留已转换为连接所有 map 的列表的 map
第二个映射函数将按键分组并将所有值放在一个序列中。
因此,您的rdd仅包含 map ,并通过键和作为值的Seq数字(与 map 中的键相匹配的数字)连接
输出应为:
(12 -> [85,4,15], 15 -> [57,4,9], 00 -> [3,4,4] .....

关于scala - 从Spark RDD提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42294849/

相关文章:

scala - java.lang.NoSuchMethodError 当 rdd.saveAsTextFile 由 spark-shell

scala - containTheSameElementsAs 如何在 specs2 中工作

scala - Intellij 的 Scala 控制台不工作

scala - scala import 是递归的吗?

Windows : Unable to load native-hadoop library for your platform. 上的 Hadoop 安装 .. 在适用的情况下使用内置 java 类

amazon-s3 - 我无法让 Hadoop 开始使用 Amazon EC2/S3

scala - apache Spark聚合函数使用最小值

scala - 转换为 Map 并访问元素的简洁语法

hadoop - Hadoop-使用PIG加载Hive表

scala - Spark : Get max consecutive decrease in value