在配置单元中如何将数据插入到单个文件中

bnl4lu3b  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(333)

插入覆盖目录“wasb:///hiveblob/”并从表1中选择*;这是可行的,但是当我们给出insert overwrite directory'wasb:///hiveblob/sample.csv'这样的命令时,从table1中选择*;失败,出现异常无法重命名:wasb://incrementalhive-1@crmdbs.blob.core.windows.net/hive/scratch/hive_2015-06-08_10-01-03_930_4881174794406290153-1/-ext-10000 收件人:wasb:/hiveblob/sample.csv
那么,有没有什么方法可以将数据插入到单个文件中

rjzwgtxy

rjzwgtxy1#

默认情况下,您将拥有多个输出文件,等于减速器的数量。这是由Hive决定的。但是,您可以配置减速器。看这里。但是,如果我们减少减速机,性能会受到影响,并且会占用更多的执行时间。或者,一旦文件存在,就可以使用get merge,将所有文件合并到一个文件中。
hadoop fs-getmerge/your/src/folder/your/dest/folder/yourfilename。src文件夹包含所有要合并的文件。

vwoqyblh

vwoqyblh2#

您可以强制配置单元生成一个文件,方法是将reducer强制为一个。这将复制一个表中的任何碎片文件,并将它们合并到hdfs中的另一个位置。当然,强制一个减速机会破坏并行性的好处。如果您计划进行任何数据转换,我建议您先进行转换,然后在最后一个单独的阶段进行转换。
要使用配置单元生成单个文件,可以尝试:

set hive.exec.dynamic.partition.mode=nostrict;
set hive.exec.compress.intermediate=false;
set hive.exec.compress.output=false;
set hive.exec.reducers.max=1;

create table if not exists db.table
stored as textfiel as
select * from db.othertable;

othertable是包含多个碎片文件的表。db.table将有一个包含组合数据的文本文件。

8nuwlpux

8nuwlpux3#

我不认为你可以告诉hive写一个特定的文件,比如 wasb:///hiveblob/foo.csv 直接。
你能做的是:
在运行查询之前,告诉配置单元将输出文件合并为一个文件。通过这种方式,您可以拥有任意多个缩减器,并且仍然拥有单个输出文件。
运行查询,例如。 INSERT OVERWRITE DIRECTORY ... 然后使用 dfs -mv 在配置单元中重命名文件。
这可能比使用单独的 hadoop fs -getmerger /your/src/folder /your/dest/folder/yourFileName 按照拉姆齐的建议。
根据所使用的运行时引擎的不同,指示合并文件的方式可能会有所不同。
例如,如果您使用 tez 作为配置单元查询中的运行时引擎,可以执行以下操作:

-- Set the tez execution engine
-- And instruct to merge the results
set hive.execution.engine=tez;
set hive.merge.tezfiles=true;

-- Your query goes here.
-- The results should end up in wasb:///hiveblob/000000_0 file.
INSERT OVERWRITE DIRECTORY 'wasb:///hiveblob/' SELECT * from table1;

-- Rename the output file into whatever you want
dfs -mv 'wasb:///hiveblob/000000_0' 'wasb:///hiveblob/foo.csv'

(以上这些版本对我很有用:hdp2.2、tez0.5.2和hive0.14.0)
对于mapreduce引擎(这是默认设置),您可以尝试以下方法,尽管我自己还没有尝试过:

-- Try this if you use MapReduce engine.
set hive.execution.engine=mr;
set hive.merge.mapredfiles=true;

相关问题