【Hive-小文件合并】Hive外部分区表利用Insert overwrite的暴力方式进行小文件合并

这里我们直接用实例来讲解,Hive外部分区表有单分区多分区的不同情况,这里我们针对不同情况进行不同的方式处理。

  • 利用overwrite合并单独日期的小文件

1、单分区

# 开启此表达式:`(sample_date)?+.+` 
set hive.support.quoted.identifiers=none;

# 此sql是将20230713分区的小文件进行合并
# `(sample_date)?+.+`:表示select 出除了sample_date分区字段以外的所有字段(字段较多的时候用这种方式很便捷)
insert overwrite table `test`.`table` 
partition(sample_date='20230713') 
sele
### Hive 部分区表的使用教程 #### 创建部分区表 创建部分区表的第一步是定义表结构并指定分区字段。Hive允许用户通过`PARTITIONED BY`关键字来声明分区列[^2]。 ```sql CREATE EXTERNAL TABLE IF NOT EXISTS external_partitioned_table ( id INT, name STRING, value DOUBLE ) PARTITIONED BY (year INT, month INT) -- 定义分区字段 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/user/hive/external/partitioned/table'; -- 数据存储路径 ``` 上述语句中,`EXTERNAL`关键字表明这是一个部表,而`LOCATION`指定了数据的实际存储路径[^5]。 #### 加载数据到部分区表 加载数据时需要显式地为每个分区提供对应的参数。可以使用`LOAD DATA INPATH`命令或者手动将文件放置到对应分区目录下[^3]。 ```bash hdfs dfs -mkdir /user/hive/external/partitioned/table/year=2023/month=10 hdfs dfs -put /local/path/to/datafile.tsv /user/hive/external/partitioned/table/year=2023/month=10/ ``` 如果希望直接通过SQL操作完成,则可执行如下命令: ```sql ALTER TABLE external_partitioned_table ADD PARTITION (year=2023, month=10); LOAD DATA INPATH '/tmp/datafile.tsv' INTO TABLE external_partitioned_table PARTITION(year=2023, month=10); ``` 需要注意的是,对于部分区表来说,即使删除表本身也不会影响底层的数据文件。 #### 查询性能优化 当查询涉及特定条件时(如过滤某个时间段内的记录),应充分利用分区特性减少扫描范围。例如: ```sql SELECT * FROM external_partitioned_table WHERE year = 2023 AND month >= 9; ``` 此查询仅访问满足条件的分区,从而显著提升效率。 #### Spark写入Hive部分区表常见问题 在Spark框架向已存在的Hive部分区表插入新数据过程中可能会遇到一些挑战。比如,默认情况下可能无法正常更新已有分区的内容[^4]。一种解决方案是在保存前动态设置目标路径以及覆盖模式: ```scala val df = spark.read.format("csv").option("header", "true").load("/input/csv/") df.write.mode("overwrite") // 或者 append 模式视需求而定 .format("orc") .partitionBy("year", "month") // 对齐hive表中的分区键名 .saveAsTable("default.external_partitioned_table"); ``` 注意这里假设了DataFrame Schema与目标表完全一致,并且启用了相应的配置项支持跨平台交互。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值