Spark Tuple获取每个键的详细信息/ rdd

时间:2015-04-23 23:29:03

标签: hadoop mapreduce apache-spark

我有这些行:

val rdd : RDD[(String, Array[String])] = ...
val rdd_res = rdd.groupByKey().map(row => (row._1, row._2.size, byteSize(row._2)))

val rddKeys = rdd_res.map(row => row._1)
val rddCount = rdd_res.map(row => row._2)     
val rddByteSize = rdd_res.map(row => row._3)

(1)如何获得唯一密钥?

(2)如何获得PER键的行数(key1-3行,key2-1行,键3-2行......所以输出为:3,1,2)

(3)如何获得行PER键的字节大小(5MB,2MB,3MB)

编辑1.这是我的新代码:

  val rdd_res : RDD[(String, (Int, Int))] = rdd.aggregateByKey((0,0))((accum, value) => (accum._1 + 1, accum._2 + size(value)), (first, second) => (first._1 + second._1, first._2 + second._2))

  val rdd_res_keys = rdd_res.map(row=>row._1).collect().mkString(",")
  val rdd_res_count = rdd_res.map(row=>row._2).collect().map(_._1).mkString(",")
  val rdd_res_bytes = rdd_res.map(row=>row._2).collect().map(_._2).mkString(",")

如何实现byteSize?我想获得将保存到磁盘的大小。

编辑2。

{{1}}

2 个答案:

答案 0 :(得分:1)

对于不同的键,您应该切换顺序:

rdd.keys.distinct.collect

但从技术上讲,您可以通过将钥匙计入地图来实现这一点......通过countByKey返回key->count的地图

rdd.countByKey

并且,为了获得字节大小,您应该查看this SO question,因为它将依赖于解码。但是,一旦你决定使用尺寸方法,那么你可以通过以下方式获得它:

rdd.aggregateByKey(0)((accum, value) => accum + size(value), _ + _)

或者,你可以一起做到这一切:

rdd.aggregateByKey((0,0))((accum, value) => (accum._1 + 1, accum._2 + size(value), (first, second) => (first._1 + second._1, first._2 + second._2))

哪个应该产生RDD[(String, (Int, Int))],其中元组中的第一项是密钥数,第二项是密钥大小

答案 1 :(得分:0)

考虑到你有一对RDD(键,值)。

您可以使用以下

获取密钥和计数
rdd_res = rdd_inp.countByKey

您可以使用以下

列出密钥的大小
rdd_size_res = rdd_inp.groupByKey().map((a,b)=>(a,size(b)))

def size(src: List[String]):List[String] = {

    src.map(a =>  (32 + a.length() * 2).toString())


  }

请检查以上内容是否适用于您的方案。