Spark006---coalesce和repartition

Intro

常用的重分区操作,简单记录下

coalesce

根据数据量缩减分区,用于大数据集过滤后,提高小数据集的执行效率。当 spark 程序中,存在过多的小任务的时候,可以通过 coalesce 方法,收缩合并分区,减少分区的个数,减小任务调度成本

  • 默认情况下,不shuffle
  • 即增加分区数,没有变化
  • 减少分区数,会把该分区数据增加到其他分区中,原有分区数据保持不变
import org.apache.spark.sql.SparkSession
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession
import org.apache.spark.rdd.RDD
def showPartitionData(dataRDD:RDD[Int]): Unit ={
    val dataRDD1 = dataRDD.mapPartitionsWithIndex(
      (index, datas) => {
        Array(Array(index.toString, datas.toArray)).toIterator
      }
    )
    val arr = dataRDD1.collect().toArray
    arr.foreach(x => {
      val index = x(0)
      val data = x(1).asInstanceOf[Array[Int]].mkString(",")
      println(s"index=${index},data=${data}")
    }
    )
  }
showPartitionData: (dataRDD: org.apache.spark.rdd.RDD[Int])Unit
    val spark = SparkSession.builder().master("local[1]").getOrCreate()
    import spark.implicits._
    val dataRDD = spark.sparkContext.makeRDD(List(1, 2, 3, 4, 5, 6), 3)
    showPartitionData(dataRDD)
index=0,data=1,2
index=1,data=3,4
index=2,data=5,6





spark: org.apache.spark.sql.SparkSession = org.apache.spark.sql.SparkSession@58767892
import spark.implicits._
dataRDD: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at makeRDD at <console>:32

三个分区,每个数据两个数据

    showPartitionData(dataRDD.coalesce(2))
index=0,data=1,2
index=1,data=3,4,5,6

缩减分区,发现分区0数据没变,分区2的数据合并到分区1

    showPartitionData(dataRDD.coalesce(4))
index=0,data=1,2
index=1,data=3,4
index=2,data=5,6
println(dataRDD.coalesce(4).getNumPartitions)
3

增加分区没有发生变化

而shuffle是会发生变化的,直接看个例子:

println(dataRDD.coalesce(4,shuffle=true).getNumPartitions)
4
    showPartitionData(dataRDD.coalesce(4,shuffle=true))
index=0,data=2,5
index=1,data=3,6
index=2,data=4
index=3,data=1

repartition

简单的说repartition就是shuffle的coalesce

                                2021-11-17 于南京市江宁区九龙湖

<think>好的,用户的问题是关于在使用Spark SQL时如何导出带有表头的CSV文件。我需要先回忆一下相关的Spark知识,特别是DataFrame的写入操作。根据引用中的信息,引用[1]提到了使用df.coalesce(1).write.format(...).option("header", "true").save(...),这里的关键是option("header", "true"),这说明设置header为true可以导出表头。 然后,我需要确认其他引用是否提供了更多相关信息。引用[3]引用[4]提到了使用spark.read.format(...).option(...).load(...),但这里用户需要的是写入操作,所以重点应该是在.write部分。引用[1]的示例代码已经明确展示了如何设置header选项,同时还有mode("overwrite")等参数。 接下来,我需要考虑用户可能的疑问,比如是否需要调整分区数,因为使用coalesce(1)可以将数据合并到一个文件中,避免多个分区生成多个文件。但用户的问题主要集中在表头上,所以需要明确说明.option("header", "true")的作用。 另外,用户可能在使用spark-sql命令行工具,如引用[2]中的spark-sql --master local[2],这时候导出数据可能需要使用INSERT OVERWRITE DIRECTORY语句,并设置相关属性,比如'header'='true'。这部分需要补充说明,因为不同的使用场景(编程API vs SQL命令行)可能有不同的方法。 最后,总结步骤,确保用户能够理解在代码中如何设置选项,以及在SQL命令行中如何处理。同时,提醒用户注意导出路径的权限文件数量的问题,比如coalescerepartition的使用,确保生成的文件符合预期。</think>在使用Spark SQL导出CSV文件时,可通过`.option("header", "true")`参数添加表头,具体实现分为编程APISQL命令行两种方式: ### 1. 编程API实现(Scala/Python) ```python # 通过DataFrame API导出含表头的CSV df.write \ .format("csv") \ .option("header", "true") \ # 启用表头 .option("sep", ",") \ # 设置分隔符 .mode("overwrite") \ # 覆盖模式写入 .save("/output/path") ``` ### 2. Spark-SQL命令行实现 ```sql -- 设置表头输出参数 SET spark.sql.csv.header=true; -- 导出数据到CSV文件 INSERT OVERWRITE DIRECTORY '/output/path' USING csv OPTIONS (header 'true') SELECT * FROM test_sdb; ``` ### 关键参数说明 1. `header`:设置为`true`时生成包含列名的首行[^1] 2. `mode`:指定写入模式(overwrite/append/ignore)[^3] 3. `sep`:自定义字段分隔符(默认逗号) 4. `coalesce`:合并输出文件(如`.coalesce(1)`生成单个文件) ### 文件输出说明 - 默认按分区生成多个文件,建议通过`coalesce()`或`repartition()`控制文件数量 - 输出路径需为空目录或使用覆盖模式[^4] - 本地路径需添加`file://`前缀,HDFS路径直接使用hdfs://格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值