【问题标题】:hive insert overwrite directory only overwrite direct path of generated file not the directory蜂巢插入覆盖目录仅覆盖生成文件的直接路径而不是目录
【发布时间】:2017-04-09 12:01:58
【问题描述】:
-bash-4.1$ hadoop fs -ls /mytest/warehouse/mytable/

Found 4 items
-------------

 - -rwxrwxrwx 3 myvm users 1163 2016-11-24 03:11 /mytest/warehouse/mytable/000000_0
 - -rwxrwxrwx 3 myvm users 0 2016-11-24 03:09 /mytest/warehouse/mytable/000000_1
 - -rwxrwxrwx 3 myvm users 0 2016-11-24 03:09 /mytest/warehouse/mytable/000000_2
 - -rwxrwxrwx 3 myvm users 0 2016-11-24 03:09 /mytest/warehouse/mytable/000000_3

问题

insert overwrite directory "/mytest/warehouse/mytable" select * from my_table

以上命令只会覆盖它正在生成的文件,即:/mytest/warehouse/mytable/000000_0

我希望它会删除路径下的所有文件并创建 1 个具有所需输出的文件。

在使用 hive-1.1.0-cdh5.5.1 之前,它似乎工作正常。

【问题讨论】:

  • 我正在使用 Hive 1.1.0-cdh5.7.1,但无法重现此行为。执行“插入覆盖目录”后,之前碰巧在该目录中的所有内容都将被删除。
  • 当“select”命令只产生1个文件(000000_0)并且输出目录有超过1个文件(000000_0,000000_1,000000_2,000000_3)时,它只会覆盖它创建的文件( 000000_0)。我怀疑它是 cdh5.5.1 中的一个错误。但无法在任何地方获得任何 jira 请求。

标签: hadoop hive hql cloudera-cdh


【解决方案1】:

它正在生成 4 个部分文件,因为您的减速器数量是 4 。在输出中只生成一个零件文件

您可以在 hive 终端中设置 hive 属性

set mapred.reduce.tasks=1

还有

reducer 的数量也取决于输入文件的大小

默认为 1GB(1000000000 字节)。您可以通过设置属性 hive.exec.reducers.bytes.per.reducer 来更改它:

通过更改 hive-site.xml

<property>
   <name>hive.exec.reducers.bytes.per.reducer</name>
   <value>1000000</value>
</property>

或使用集合

$ hive -e "设置 hive.exec.reducers.bytes.per.reducer=1000000"

【讨论】:

  • 感谢 Rijul 的回答。我希望根据我的应用程序需要创建多个文件。我想知道为什么插入覆盖没有按预期工作。它不应该在写入新数据之前覆盖目录中的所有文件吗?
猜你喜欢
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 2014-01-09
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
相关资源
最近更新 更多