是否可以在同一个HDFS目录结构中显示多个hive表?换句话说,有没有办法让多个配置单元表指向相同/重叠的HDFS路径?
以下是我的情况:
我有一个名为“mytable”的表,位于hdfs:/ tables / mytable
中CREATE EXTERNAL TABLE mytable
(
id int,
...
[a whole bunch of columns]
...
PARTITIONED BY (logname STRING)
STORED AS [I-do-not-know-what-just-yet]
LOCATION 'hdfs:/tables/mytable';
因此,HDFS将如下所示:
hdfs:/tables/mytable/logname=tarzan/....
hdfs:/tables/mytable/logname=jane/....
hdfs:/tables/mytable/logname=whoa/....
是否可以在hdfs:/ tables / mytable / logname = tarzan中创建一个名为“tarzan”的配置单元表?与hive表“jane”相同,位于hdfs:/ tables / mytable / logname = jane等。
tarzan,jane,whoa等子表共享一些列(timestamp,ip_address,country,user_id和其他一些列),但也会有很多列没有共同点。
有没有办法在HDFS中存储一次这个数据,并将其用于多个表,如上所述?此外,有没有办法以有效的方式存储数据,因为许多表将具有不常见的列?在这种情况下,像RCFILE或PARQUET这样的文件格式会起作用吗?
非常感谢任何人提供的任何提示或帮助,
答案 0 :(得分:3)
是的,我们可以有多个具有相同底层HDFS目录的配置单元表。
示例:
创建表emp
并将数据文件file3
加载到其中。
create table emp (id int, name string, salary int)
row format delimited
fields terminated by ','
-- default location would be used
load data
local inpath '/home/parv/testfiles/file3'
into table emp;
创建另一个表mirror
。当您从mirror
表中选择数据时,它将与emp
表(file3的内容)相同。
create table mirror (id int, name string, salary int)
row format delimited
fields terminated by ','
location 'hdfs:///user/hive/warehouse/parv.db/base';
将数据加载到mirror
表中。当您从mirror
表或emp
表中选择数据时,它将返回相同的结果(file3和file4的内容)。
load data
local inpath '/home/parv/testfiles/file4'
into table mirror;
结论:
emp
和mirror
共享相同的数据文件。emp
表的数据目录,而不显示mirror
表的数据目录。但是,这两个表都存在于配置单元中,因此可以查询。答案 1 :(得分:0)
是的,您可以将多个表指向HDFS上的相同位置。但是,Hive不支持动态列。
有没有理由你不能只有3个不同的表?这将允许您为每个都有不同的模式(列)。
- 布兰登
答案 2 :(得分:0)
回答我自己的问题:
可能有多个hive表由相同的HDFS目录结构表示,但是我想要做的是:
更好的解决方案是使用1 mytable表,按logname分区,并为每个logname表创建视图,每个只需要列的子集。