【问题标题】:How to force CTAS to generate a single file?如何强制 CTAS 生成单个文件?
【发布时间】:2017-02-20 06:04:24
【问题描述】:

我正在使用带有 hive 服务的 HDP 2.5。当我使用以下查询创建配置单元表时;

create table Sample_table 
row format delimited 
fields terminated by '|' 
stored as textfile 
AS 
select * 
from sample_table_unique 
where state='AL'; 

我可以创建具有特定位置的外部表。

我的问题是,当我创建表/外部表时,存储的文件已被拆分,即。如下所示,明智的文件已被拆分。

/apps/hive/warehouse/sampledb/sample_table:
00000_0,
00001_0,
00002_0,
00003_0,

我不想要那些拆分的文件,我想要一个像 00000_0 这样的合并文件。我不知道它是怎么发生的。请告诉我如何解决这个问题。

【问题讨论】:

  • 这是HDFS文件系统的基本概念......文件将由hdfs管理......
  • 是的,我知道。但我想要单个文件。我该怎么做。
  • 为什么? ..........
  • state='AL' 的数据相同。
  • 为什么要一个文件?

标签: hadoop hive hdfs


【解决方案1】:

SELECT 语句运行映射器/mapreduce(取决于选择查询)作业,以将数据从源表 sample_table_unique 写入目标表 sample_table。 根据任务的数量,生成的文件数量可能会有所不同。 要将它们合并为一个,您可以在hive-site.xml 中为会话永久设置这些属性

hive> SET hive.merge.mapfiles=true;
hive> SET hive.merge.mapredfiles=true;
hive> SET hive.merge.smallfiles.avgsize=16000000;
hive> SET hive.merge.size.per.task=256000000;

如果是TEZ执行引擎,使用

hive> SET hive.merge.tezfiles=true;

而不是mapfilesmapredfiles

当作业的平均输出文件大小小于此hive.merge.smallfiles.avgsize 数字时,Hive 将启动额外的 map-reduce 作业以将输出文件合并为更大的文件。 hive.merge.smallfiles.avgsizehive.merge.size.per.task 的值是默认值,请根据输入大小进行相应更改。

【讨论】:

  • 很抱歉,我可以在 hive 中设置上述设置,但仍然无法正常工作。这些文件已拆分。请告诉我如何解决。
  • 您是否尝试更改尺寸值?我发布的都是默认的。另外生成的0000*_0 文件的大小是多少?
  • 00000_0 : 1.5kb,00001_0:1.6kb,00002_0:0.2kb。最大只有 1mb。大多数 kb 明智的文件被拆分
  • 您是如何设置这些属性的,CREATE 语句是如何执行的?两者都在同一个外壳中?
  • 这些设置是在 hive 会话中设置的。 TEZ 执行引擎。是的,我确定是同一个外壳。
猜你喜欢
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 2011-05-10
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
相关资源
最近更新 更多