Hive 查询 - INSERT OVERWRITE LOCAL DIRECTORY 为单个 table 创建多个文件
Hive query - INSERT OVERWRITE LOCAL DIRECTORY creates multiple files for a single table
我从配置单元 table myTable 中执行以下操作。
插入覆盖本地目录'/myDir/out' SELECT concat_ws('',NAME,PRODUCT,PRC,field1,field2,field3,field4,field5) FROM myTable;
因此,此命令会在文件夹 out/ 中生成 2 个文件 000000_0 和 000001_0。
但是,我需要将内容作为一个文件。我应该怎么办?
目录中有多个文件,因为每个reducer 都在写入一个文件。如果您确实需要将内容作为单个文件,运行 您的 map reduce 作业只有 1 个 reducer,它将写入单个文件。
但是,根据您的数据大小,这可能不是 运行 单个减速器的好方法。
编辑:与其强制 hive 执行 运行 1 reduce 任务并输出单个 reduce 文件,不如使用 hadoop fs 操作将输出合并到单个文件。
例如
hadoop fs -text /myDir/out/* | hadoop fs -put - /myDir/out.txt
有点晚了,但我发现使用 LIMIT large_number
,其中 large_number
比查询中的行大。它强制配置单元至少使用一个减速器。例如:
set mapred.reduce.tasks=1; INSERT OVERWRITE LOCAL DIRECTORY '/myDir/out' SELECT * FROM table_name LIMIT 1000000000
工作完美。
CLUSTER BY 将完成这项工作。
我从配置单元 table myTable 中执行以下操作。
插入覆盖本地目录'/myDir/out' SELECT concat_ws('',NAME,PRODUCT,PRC,field1,field2,field3,field4,field5) FROM myTable;
因此,此命令会在文件夹 out/ 中生成 2 个文件 000000_0 和 000001_0。
但是,我需要将内容作为一个文件。我应该怎么办?
目录中有多个文件,因为每个reducer 都在写入一个文件。如果您确实需要将内容作为单个文件,运行 您的 map reduce 作业只有 1 个 reducer,它将写入单个文件。
但是,根据您的数据大小,这可能不是 运行 单个减速器的好方法。
编辑:与其强制 hive 执行 运行 1 reduce 任务并输出单个 reduce 文件,不如使用 hadoop fs 操作将输出合并到单个文件。 例如
hadoop fs -text /myDir/out/* | hadoop fs -put - /myDir/out.txt
有点晚了,但我发现使用 LIMIT large_number
,其中 large_number
比查询中的行大。它强制配置单元至少使用一个减速器。例如:
set mapred.reduce.tasks=1; INSERT OVERWRITE LOCAL DIRECTORY '/myDir/out' SELECT * FROM table_name LIMIT 1000000000
工作完美。
CLUSTER BY 将完成这项工作。