【问题标题】:Order by Value in Spark pairRDD from (Key,Value) where the value is from spark-sql按值排序 Spark pairRDD from (Key,Value) 其中值来自 spark-sql
【发布时间】:2015-05-27 07:05:26
【问题描述】:

我已经创建了这样的地图 -

val b = a.map(x => (x(0), x) ) 

这里的 b 是类型

org.apache.spark.rdd.RDD[(Any, org.apache.spark.sql.Row)]
  1. 如何使用值行中的字段对每个键中的 PairRDD 进行排序?
  2. 之后,我想运行一个函数,该函数按照之前的排序顺序单​​独处理每个 Key 的所有值。那可能吗?如果可以,请举个例子。
  3. 对 Pair RDD 进行分区是否需要考虑任何因素?

【问题讨论】:

  • 简单的方法是按键分组,然后对(本地)值可迭代对象进行排序,然后对值运行函数。如果一个键没有太多值,这是可行的。

标签: scala apache-spark


【解决方案1】:

只回答你的第一个问题:

val indexToSelect: Int = ??? //points to sortable type (has Ordering or is Ordered)
sorted = rdd.sortBy(pair => pair._2(indexToSelect))

这是做什么的,它只是选择对中的第二个值 (pair._2),然后从该行中选择适当的值((indexToSelect) 或更详细:.apply(indexToSelect))。

【讨论】:

  • 由于Row 返回Any,您还必须显式提供隐式Ordering[Any]ClassTag[Any],可能通过类型转换值:sortBy(_._2(idx))(yourOrdering, yourClassTag)
  • 感谢您的帮助@Gábor Bakos。我曾尝试过这样的事情 - b.foreach(println(_._2(2))) 但我收到错误 missing parameter type for expanded function ((x$1) => x$1._2(2))
  • 在这种情况下,请尝试以下操作:b.foreach(println((pair: (Any, Row)) => row._2(2)))
  • 我查看了linkOrderingClassTagClassTag 将是 Any,据我所知,但我如何从 Any 中的 Ordering 获取 idx 字段@
  • 您必须为该任务进行投射。如果你事先知道结构,你可能不需要ClassTags,isInstanceOf 可能就足够了。
猜你喜欢
  • 2016-08-26
  • 1970-01-01
  • 2014-08-30
  • 2018-10-27
  • 2015-06-30
  • 2021-02-24
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
相关资源
最近更新 更多