Spark中DF落地到hive中进行动态分区以及小文件问题

五个注意点

hive的动态分区需要开启非严格模式

set hive.exec.dynamic.partition.mode=nonstrict

insertInto方式不支持分区表数据导入

saveAsTable与insertInto的区别

指定的分区列必须为当前表中的某个列

比如一张主题表中想保留Long类型的ct字段,又想根据ct转化为String类型的bdp_day来进行分区,
就需要在当前表中既有ct这一列,又要有bdp_day这一列

落地到hdfs上每个分区中可能会有很多小文件

需要在落地之前将DF.repartition(xx)      //根据实际文件大小,减少分区数即可

hive中的表不需要存在

如果想手动在hive中创建目标表,则需要将分区的列名创建到表中
其次,不需要创建分区表,只要将需要分区的列名添加到建表语句中即可
  • 举个例子:

df.map(perline => {
    val release_session: String = perline.getAs[String]("release_session")
    val release_status: String = perline.getAs[String]("release_status")
    val device_num: String = perline.getAs[String]("device_num")
    val device_type: String = perline.getAs[String]("device_type")
    Long = perline.getAs[Long]("ct")
    val bdp_day: String = new DateTime(ct.toString().substring(0, 10)
    (release_session, release_status, device_num, device_type, ct,bdp_day)
  }).toDF("release_session", "release_status", "device_num", "device_type","ct","bdp_day")
  .sort(asc("ct")).cache()
.repartition(2).write.mode(SaveMode.Overwrite).format("parquet").partitionBy("bdp_day").saveAsTable("dw_release.dw_release_customer")


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值