0

下表在运行 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

4 回答 4

1

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

如果您有一些外部进程每天生成的数据,您应该考虑按日期对表进行分区。然后,当数据可用时,您需要向表中添加一个新分区。

于 2016-01-27T14:44:17.127 回答
0

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

hadoop fs -cat /user/data/CSV/*/*/*/*/part-* | hadoop fs -put - <destination folder>
于 2016-02-03T13:12:52.137 回答
0

这条线

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

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

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

于 2016-02-03T17:17:42.227 回答
0

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

 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

陈述。像在另一个表中一样创建模式。然后更改表格以指向您想要的文件。

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

于 2016-02-03T16:07:21.977 回答