插入覆盖目录“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
那么,有没有什么方法可以将数据插入到单个文件中
3条答案
按热度按时间rjzwgtxy1#
默认情况下,您将拥有多个输出文件,等于减速器的数量。这是由Hive决定的。但是,您可以配置减速器。看这里。但是,如果我们减少减速机,性能会受到影响,并且会占用更多的执行时间。或者,一旦文件存在,就可以使用get merge,将所有文件合并到一个文件中。
hadoop fs-getmerge/your/src/folder/your/dest/folder/yourfilename。src文件夹包含所有要合并的文件。
vwoqyblh2#
您可以强制配置单元生成一个文件,方法是将reducer强制为一个。这将复制一个表中的任何碎片文件,并将它们合并到hdfs中的另一个位置。当然,强制一个减速机会破坏并行性的好处。如果您计划进行任何数据转换,我建议您先进行转换,然后在最后一个单独的阶段进行转换。
要使用配置单元生成单个文件,可以尝试:
othertable是包含多个碎片文件的表。db.table将有一个包含组合数据的文本文件。
8nuwlpux3#
我不认为你可以告诉hive写一个特定的文件,比如
wasb:///hiveblob/foo.csv
直接。你能做的是:
在运行查询之前,告诉配置单元将输出文件合并为一个文件。通过这种方式,您可以拥有任意多个缩减器,并且仍然拥有单个输出文件。
运行查询,例如。
INSERT OVERWRITE DIRECTORY ...
然后使用dfs -mv
在配置单元中重命名文件。这可能比使用单独的
hadoop fs -getmerger /your/src/folder /your/dest/folder/yourFileName
按照拉姆齐的建议。根据所使用的运行时引擎的不同,指示合并文件的方式可能会有所不同。
例如,如果您使用
tez
作为配置单元查询中的运行时引擎,可以执行以下操作:(以上这些版本对我很有用:hdp2.2、tez0.5.2和hive0.14.0)
对于mapreduce引擎(这是默认设置),您可以尝试以下方法,尽管我自己还没有尝试过: