下表在运行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条答案
按热度按时间8xiog9wr1#
配置单元不遍历多个文件夹-因此在上面的场景中,我运行了一个命令行参数,该参数遍历这些多个文件夹和cat(打印到控制台)所有部件文件,然后将其放到所需的位置
cidc1ykv2#
首先,表定义缺少列。第二,外部表的位置总是指向文件夹,而不是特定的文件。配置单元将把文件夹中的所有文件都视为表的数据。
如果您的数据是由某个外部进程(例如每天)生成的,您应该考虑按日期对表进行分区。然后需要在数据可用时向表中添加一个新分区。
w6mmgewl3#
您可以使用ALTERTABLE语句来更改位置。在下面的示例中,分区基于数据存储在时间相关文件位置的日期。如果我想搜索很多天,我必须为每个位置添加altertable语句。这个想法可能很适合你的情况。使用其他一些技术(如python)创建一个脚本来生成createtable语句,如下所示。
可以使用任意多的add和drop语句来定义位置。然后,您的表可以在hdfs中的多个位置找到数据,而不是将所有文件放在一个位置。
你也可以利用
声明。创建一个类似于另一个表的模式。然后更改表以指向所需的文件。
我知道这不是你想要的,更像是一个工作。祝你好运!
fd3cxomn4#
这条线
看起来不正确,我认为不能从多个位置创建表。您是否尝试过通过单个位置导入来确认这一点?
也可能是您使用的分隔符不正确。如果使用csv文件导入数据,请尝试使用“,”分隔。