内容纲要
概要描述
hive.filesink.skip.empty.file
参数,用于控制空文件是否被 inceptor 的 FileSink 操作跳过。当设置为 true 时,如果写入文件是空的,FileSink 不会创建这个文件。这有助于避免在 HDFS 中创建不必要的小文件,是 计算端-reduce阶段 减少小文件数量的有效方案。
详细说明
--目标表为5个分桶的orc普通表
DROP TABLE IF EXISTS orc_dest;
CREATE TABLE orc_dest(id INT ,name STRING ) CLUSTERED BY (id) INTO 5 BUCKETS STORED AS ORC;
--源表
DROP TABLE IF EXISTS orc_src;
CREATE TABLE orc_src(id INT ,name STRING ) STORED AS ORC;
INSERT INTO orc_src SELECT 1,'a' FROM system.dual;
INSERT INTO orc_src SELECT 2,'a' FROM system.dual;
INSERT INTO orc_src SELECT 3,'a' FROM system.dual;
参数开启状态下:
--开启参数:
SET hive.filesink.skip.empty.file=true;
INSERT OVERWRITE TABLE orc_dest SELECT * FROM orc_src;
可以看到,目标表hdfs目录下只有3个数据文件生成,每个数据文件都有1条数据。
[root@kv1~]# hdfs dfs -ls hdfs://nameservice1/quark1/user/hive/warehouse/default.db/hive/orc_dest
WARNING: log4j.properties is not found. HADOOP_CONF_DIR may be incomplete.
2024-12-05 11:15:06,095 INFO [main] util.KerberosUtil (KerberosUtil.java:getDefaultPrincipalPattern(67)) - Using principal pattern: HTTP/_HOST
Found 3 items
-rwxr-xr-x 3 hive hbase 273 2024-12-05 11:14 hdfs://nameservice1/quark1/user/hive/warehouse/default.db/hive/orc_dest/000001_0
-rwxr-xr-x 3 hive hbase 277 2024-12-05 11:14 hdfs://nameservice1/quark1/user/hive/warehouse/default.db/hive/orc_dest/000002_0
-rwxr-xr-x 3 hive hbase 277 2024-12-05 11:14 hdfs://nameservice1/quark1/user/hive/warehouse/default.db/hive/orc_dest/000003_0
参数关闭状态下:
--关闭参数:
SET hive.filesink.skip.empty.file=false;
INSERT OVERWRITE TABLE orc_dest SELECT * FROM orc_src;
SHOW CREATE TABLE orc_dest;
dfs -ls hdfs://nameservice1/quark1/user/hive/warehouse/default.db/hive/orc_dest
目标表hdfs目录下有5个数据文件生成,其中000000_0
和000004_0
是没有数据的
[root@kv1~]# hdfs dfs -ls hdfs://nameservice1/quark1/user/hive/warehouse/default.db/hive/orc_dest
WARNING: log4j.properties is not found. HADOOP_CONF_DIR may be incomplete.
2024-12-05 11:15:37,654 INFO [main] util.KerberosUtil (KerberosUtil.java:getDefaultPrincipalPattern(67)) - Using principal pattern: HTTP/_HOST
Found 5 items
-rwxr-xr-x 3 hive hbase 71 2024-12-05 11:15 hdfs://nameservice1/quark1/user/hive/warehouse/default.db/hive/orc_dest/000000_0
-rwxr-xr-x 3 hive hbase 273 2024-12-05 11:15 hdfs://nameservice1/quark1/user/hive/warehouse/default.db/hive/orc_dest/000001_0
-rwxr-xr-x 3 hive hbase 277 2024-12-05 11:15 hdfs://nameservice1/quark1/user/hive/warehouse/default.db/hive/orc_dest/000002_0
-rwxr-xr-x 3 hive hbase 277 2024-12-05 11:15 hdfs://nameservice1/quark1/user/hive/warehouse/default.db/hive/orc_dest/000003_0
-rwxr-xr-x 3 hive hbase 71 2024-12-05 11:15 hdfs://nameservice1/quark1/user/hive/warehouse/default.db/hive/orc_dest/000004_0
一些第三方工具,比如 datax 无法识别这种空文件。
通过 orcfiledump
解析也会抛出 java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
的错误。