spark中自定义多维度排序

本文介绍如何在Spark中实现多维度排序。通过自定义排序Key,实现了基于三个维度的数据排序,并给出了具体的实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在spark中,原始的sortByKey是以map为操作对象,按照key进行排序,value跟随

如果我们要设置多维排序,就需要自定义这个key对象

下面以三维度为例:

该class需要 extends Ordered[T] with Serializable , 然后将这个类的对象作为sortByKey的第一个key参数,进行sort

 

val conf = new SparkConf()
conf.setAppName("thirdSort")
conf.setMaster("local")
val sc = new SparkContext(conf)

val lines = sc.textFile("d:/third.txt")

val a = lines.map(line => (new ThirdOrderKey(line.split(" ")(0).toInt,line.split(" ")(1).toInt,line.split(" ")(2).toInt),line))     // 将每行的key分别装入到ThirdOrderKey对象

a.sortByKey(false).map(x=>x._2).collect.foreach (println)                           //  sortByKey的结果会自动添加一行key,结果是value

  

下面是ThirdOrderKey的定义,2个关键点,一个是extends Ordered,另外一个是实现compare方法

class  ThirdOrderKey(val first:Int,val second:Int,val thrid:Int) extends Ordered[ThirdOrderKey] with Serializable {

  def compare(other:ThirdOrderKey):Int ={

    if(this.first-other.first!=0) {
      this.first-other.first
    }
    else if(this.second - other.second !=0)
    {
      this.second-other.second
    }
    else
    {
      this.thrid - other.thrid
    }
  }
}

  

转载于:https://www.cnblogs.com/jackie2016/p/5667025.html

### Spark中SMJ算法支持不等值连接的原因 在Spark SQL的查询优化器中,Sort-Merge Join (SMJ) 是一种常见的Join策略。然而,在涉及不等值连接(Non-Equijoin)的情况下,SMJ的支持机制需要特别关注数据分布和排序特性。 #### 数据分区与排序 为了使SMJ能够高效运行,参与Join操作的两个表必须按照相同的键进行分区,并且各自的数据需按该键排序[^1]。当遇到不等值连接时,虽然无法直接依赖于相等条件来简化匹配逻辑,但仍可以通过预处理阶段调整数据顺序以适应特定范围约束。例如: - **左表** 和 **右表** 都基于某个字段完成全局有序排列; - 利用这些已知次序信息,在后续迭代过程中快速定位可能满足非严格等于关系的目标记录区间。 此方法有效降低了不必要的交叉验证次数,从而提升了整体性能表现。 #### 实现细节分析 以下是关于如何具体实施这一流程的关键点说明: 1. **初始准备** - 对两方输入源分别执行`repartitionAndSortWithinPartitions()`操作,确保每一分区内局部有序的同时保持跨节点间一致性。 ```scala val sortedLeftDF = leftDF.repartition(numPartitions, joinKey).sortWithinPartitions(joinKey) val sortedRightDF = rightDF.repartition(numPartitions, joinKey).sortWithinPartitions(joinKey) ``` 2. **合并逻辑定制** - 自定义Merge函数时考虑额外过滤条款,比如小于、大于或者介于某区间的场景下应怎样推进指针位置。 3. **资源管理考量** 根据实际业务需求评估是否启用广播变量加速小型维度表加载速度;而对于大规模事实表,则遵循常规路径分配充足shuffle bandwidth避免网络瓶颈影响吞吐量[^2]. 综上所述,尽管传统意义上SMJ更倾向于处理标准形式下的笛卡尔积衍生问题即仅含 "=" 符号表达的关系运算符组合而成的标准SQL语句部分,但在现代大数据框架诸如Apache Spark里头已经扩展到了涵盖更多样化的关联形态之中去了——这其中包括但不限于前述提及过的那些涉及到"<",">","BETWEEN ... AND ..."等等诸如此类情况下的灵活运用实例展示出来给我们看呢! ```python from pyspark.sql import SparkSession spark = SparkSession.builder.appName("smj_unequal_join").getOrCreate() # Example DataFrames creation omitted for brevity. sorted_left_df = ( left_df .repartition(spark.conf.get("spark.sql.shuffle.partitions"), "join_key") .sortWithinPartitions("join_key") ) sorted_right_df = ( right_df .repartition(spark.conf.get("spark.sql.shuffle.partitions"), "join_key") .sortWithinPartitions("join_key") ) result_df = sorted_left_df.join( sorted_right_df, on=(col("left_col") < col("right_col")) & (col("another_condition")), how="inner" ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值