1sparksql优化之coalesce

一、coalesce算址的使用

使用coalesce算子,可以手动减少DataFrame的partition数量,并且不用触发shuffle,这也是coalesce跟repartition的区别。

repartition(numPartitions:Int):RDD[T]

coalesce(numPartitions:Int,shuffle:Boolean=false):RDD[T]

以上为他们的定义,区别就是repartition一定会触发shuffle,而coalesce默认是不触发shuffle的。

二、coalesce算址我这次使用的场景

代码


val num_executors = 6

val executor_cores = 8

val stg_device_task_nums = num_executors.toInt * executor_cores.toInt *3

val queryDate = args(0).trim

val stg_device_hql =s"""

|SELECT  s.day AS s_day,

|        s.app_key AS s_app_key,

|        s.device_id AS s_device_id,

|        s.tmp_id AS s_tmp_id

|FROM hqb.device_info_d s

    |WHERE day='$queryDate'

|        AND app_key <> 'null'

|        AND tmp_id <> 'null'

|        AND s.tmp_id is NOT null

""".stripMargin

val stg_device_df = hiveContext.sql(stg_device_hql).coalesce(stg_device_task_nums)




这里为什么要用到coalesce呢?是因为,如果不使用的话,我查询的表是用

[isuhadoop@zk200 ~]$ hadoop fs -ls /user/hive/warehouse/hqb.db/device_info_d/day=20171206/*/ | wc -l

1868

文件类型为-m-00217.gz

文件都不大,在10.5M左右,但是是gz压缩文件,会产生1868个分区,造成启动太多的task,时间反而较慢,把其改成了6*8*3=144,分区为144,启动144个task,反而速度较快。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容