Spark开发(一)-- 分区,分桶和数据重分区方法

本文介绍了数据处理中的关键概念——分区、分桶和重分区。分区通过逻辑组织数据和负载均衡提升查询效率,通常基于列值创建子目录。分桶则是通过哈希值确保相同列值的数据在同一分区,常与sortBy配合使用。重分区则根据指定表达式重新分布数据,可增加或减少并行度,coalesce避免shuffle,而repartition会涉及数据重新分布。
摘要由CSDN通过智能技术生成
  • 分区:Partitioning:
    • 分区数据通常用于水平分配负载,这具有性能优势,并有助于以逻辑方式组织数据。
    • 分区表会更改持久化数据的结构,现在将创建反映此分区结构的子目录。
    • 这可以显着提高查询性能,但前提是分区方案反映了常见的过滤 。根据指定列进行分区存储,每个列值一个文件结构。
df.write.partitionedBy(column*) .parquet("")
  • 分桶:Bucketing:

    • Bucketing是另一种将数据集分解为更易于管理的部分的技术 . 根据提供的列,将整个数据散列到用户定义数量的存储区(文件)中 。

    • Bucket和Partition的区别,Bucket的最终目的也是实现分区,但是和Partition的原理不同,当我们根据指定列进行Partition的时候,Spark会根据列的名字对数据进行分区(如果没有指定列名则会根据一个随机信息对数据进行分区)。Bucketing的最大不同在于它使用了指定列的哈希值,这样可以保证具有相同列值的数据被分到相同的分区。

    • 怎么用 Bucket,按Bucket保存,目前在使用 bucketBy 的时候,必须和 sortBy,saveAsTable 一起使用,如下。这个操作其实是将数据保存到了文件中(如果不指定path,也会保存到一个临时目录中)。

df.write
  .bucketBy(10, "name")
  .sortBy("name")
  .mode(SaveMode.Overwrite)
  .option("path","/path/to")
  .saveAsTable("bucketed")

将 columns 相同的数据分到同一文件中来分组数据 . 生成的文件个数由 n 控制。

  • 重分区:Repartition:

    • 它根据给定的分区表达式将一个新的 DataFrame 均衡地返回到给定数量的内部文件中 。生成的DataFrame是散列分区的 。coalesce()方法的参数shuffle默认设置为false,repartition()方法就是coalesce()方法shuffle为true的情况。

1、coalesce()方法源码

def coalesce(numPartitions: Int, shuffle: Boolean = false)(implicit ord: Ordering[T] = null)
    : RDD[T] = withScope {
  if (shuffle) { 
  }
  else {
  }
}

返回一个经过简化到numPartitions个分区的新RDD。这会产生一个窄依赖,例如:你将1000个分区转换成100个分区,这个过程不会发生shuffle,相反如果10个分区转换成100个分区将会发生shuffle。如果想要减少分区数,考虑使用coalesce,这样可以避免执行shuffle。

2、repartition()方法源码

def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = withScope {
  coalesce(numPartitions, shuffle = true)
}

返回一个恰好有numPartitions个分区的RDD,可以增加或者减少此RDD的并行度。内部使用shuffle重新分布数据。

根据columns内容重新分配partition。请注意,没有数据持久存储到存储,这只是基于类似 bucketBy 的约束的数据内部 Balance。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值