Hive中的外部表 - 位置

时间:2016-01-27 13:54:10

标签: hive external-tables bigdata

下表在运行select语句时不返回任何数据

CREATE EXTERNAL TABLE foo (
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\073'
LINES TERMINATED BY '\n'
LOCATION '/user/data/CSV/2016/1/27/*/part-*';

我需要我的配置单元指向动态文件夹,以便mapreduce作业将部件文件放在文件夹中,并将配置单元加载到表中。

是否有任何方式使位置像

一样动态化
/user/data/CSV/*/*/*/*/part-*

或只是/user/data/CSV/*会好吗?

(相同的代码在创建为内部表并加载文件路径时工作正常 - 因此格式化没有问题)

4 个答案:

答案 0 :(得分:1)

首先,您的表定义缺少列。其次,外部表位置始终指向文件夹,而不是特定文件。 Hive会将文件夹中的所有文件都视为该表的数据。

如果您有生成的数据,例如在某些外部流程的日常工作中,您应该考虑按日期对表进行分区。然后,当数据可用时,您需要向表中添加新分区。

答案 1 :(得分:0)

Hive不会遍历多个文件夹 - 因此对于上述情况 我运行了一个命令行参数,它遍历这些多个文件夹和cat(打印到控制台)所有零件文件,然后将它放到所需的位置。(Hive指向)

hadoop fs -cat /user/data/CSV/*/*/*/*/part-* | hadoop fs -put - <destination folder>

答案 2 :(得分:0)

您可以使用alter table语句更改位置。在下面的示例中,分区基于数据存储在时间相关文件位置的日期。如果我想搜索很多天,​​我必须为每个位置添加一个alter table语句。这个想法可能会很好地适应您的情况。您可以使用其他一些技术(如python)创建一个脚本来生成如下所示的create table语句。

 CREATE EXTERNAL TABLE foo (
 )
 ROW FORMAT DELIMITED
 FIELDS TERMINATED BY '\073'
 LINES TERMINATED BY '\n'
 ;
 alter table foo add partition (date='20160201') location /user/data/CSV/20160201/data;
 alter table foo add partition (date='20160202') location /user/data/CSV/20160202/data;
 alter table foo add partition (date='20160203') location /user/data/CSV/20160203/data;
 alter table foo add partition (date='20160204') location /user/data/CSV/20160204/data;

您可以使用所需数量的添加和删除语句来定义您的位置。然后,您的表可以在HDFS中的许多位置查找数据,而不是将所有文件放在一个位置。

您也可以利用

create table like

语句。创建一个类似于另一个表中的模式。然后改变表格以指向您想要的文件。

我知道这不是你想要的,而是更多的解决方法。祝你好运!

答案 3 :(得分:0)

这一行

     LOCATION '/user/data/CSV/2016/1/27/*/part-*';

看起来不正确,我不认为该表可以从多个位置创建。您是否尝试过只通过一个位置导入来确认这一点?

也可能是您使用的分隔符不正确。如果您使用CSV文件导入数据,请尝试按&#39;,&#39;

进行分隔。