下表在运行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/*
会好吗?
(相同的代码在创建为内部表并加载文件路径时工作正常 - 因此格式化没有问题)
答案 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;
进行分隔。