位置

vbopmzt1  于 2021-06-26  发布在  Hive
关注(0)|答案(4)|浏览(240)

下表在运行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/* 行吗?
(当创建为内部表并加载文件路径时,相同的代码可以正常工作-因此不会因为格式化而出现问题)

8xiog9wr

8xiog9wr1#

配置单元不遍历多个文件夹-因此在上面的场景中,我运行了一个命令行参数,该参数遍历这些多个文件夹和cat(打印到控制台)所有部件文件,然后将其放到所需的位置

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

cidc1ykv2#

首先,表定义缺少列。第二,外部表的位置总是指向文件夹,而不是特定的文件。配置单元将把文件夹中的所有文件都视为表的数据。
如果您的数据是由某个外部进程(例如每天)生成的,您应该考虑按日期对表进行分区。然后需要在数据可用时向表中添加一个新分区。

w6mmgewl

w6mmgewl3#

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

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;

可以使用任意多的add和drop语句来定义位置。然后,您的表可以在hdfs中的多个位置找到数据,而不是将所有文件放在一个位置。
你也可以利用

create table like

声明。创建一个类似于另一个表的模式。然后更改表以指向所需的文件。
我知道这不是你想要的,更像是一个工作。祝你好运!

fd3cxomn

fd3cxomn4#

这条线

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

看起来不正确,我认为不能从多个位置创建表。您是否尝试过通过单个位置导入来确认这一点?
也可能是您使用的分隔符不正确。如果使用csv文件导入数据,请尝试使用“,”分隔。

相关问题