{ val obj = ParseJsonData.getJsonData(item) obj.isInstanceOf[JSONObject]..._hive 一张表有200个文件 怎么变成10个文件">
当前位置:   article > 正文

Hive on Spark中分桶表如何控制存储在hdfs文件个数_hive 一张表有200个文件 怎么变成10个文件

hive 一张表有200个文件 怎么变成10个文件
  1. 建表语句
   import sparkSession.implicits._
    ssc.textFile("/user/ods/coursepay.log")
      .filter(item => {
        val obj = ParseJsonData.getJsonData(item)
        obj.isInstanceOf[JSONObject]
      }).mapPartitions(partitions => {
      partitions.map(item => {
        val jsonObject = ParseJsonData.getJsonData(item)
        val orderid = jsonObject.getString("orderid")
        val paymoney = jsonObject.getString("paymoney")
        val discount = jsonObject.getString("discount")
        val createtime = jsonObject.getString("createitme")
        val dt = jsonObject.getString("dt")
        val dn = jsonObject.getString("dn")
        (orderid, discount, paymoney, createtime, dt, dn)
      })
    }).toDF("orderid", "discount", "paymoney", "createtime", "dt", "dn").
      write.partitionBy("dt", "dn").
      bucketBy(10, "orderid").sortBy("orderid").
      mode(SaveMode.Append).saveAsTable("dwd.dwd_course_pay_cluster")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  1. 存储在hdfs文件个数分析
    原始文件大小2.3G,启动task数量为19个(2.3*1024/128=18.3向上取整,因为textFile取出文件调用的是hadoop的API,默认用的textInputformat,hdfs上默认切片大小为128M),分桶表每个task默认根据分桶字段的hash值写入到10个文件中,共190个文件。
    在这里插入图片描述
    在这里插入图片描述
  2. 减少写出文件个数,在write前调用coalesce(1),将task数量改为1,最后写出文件个数为10个。
.toDF("orderid", "discount", "paymoney", "createtime", "dt", "dn").
      coalesce(1).
      write.partitionBy("dt", "dn").
      bucketBy(10, "orderid").sortBy("orderid").
      mode(SaveMode.Append).saveAsTable("dwd.dwd_course_pay_cluster")
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/718867
推荐阅读
相关标签
  

闽ICP备14008679号