是否可以在同一HDFS目录结构中表示多个hive表?

时间:2014-01-15 17:08:31

标签: hadoop hive hdfs

是否可以在同一个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这样的文件格式会起作用吗?

非常感谢任何人提供的任何提示或帮助,

3 个答案:

答案 0 :(得分:3)

是的,我们可以有多个具有相同底层HDFS目录的配置单元表。

示例:

  1. 创建表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; 
    
  2. 创建另一个表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';
    
  3. 将数据加载到mirror表中。当您从mirror表或emp表中选择数据时,它将返回相同的结果(file3和file4的内容)。

    load data 
    local inpath '/home/parv/testfiles/file4' 
    into table mirror;  
    
  4. 结论:

    1. 两个表empmirror共享相同的数据文件。
    2. 但是,奇怪的是,HDFS文件系统只显示emp表的数据目录,而不显示mirror表的数据目录。但是,这两个表都存在于配置单元中,因此可以查询。

答案 1 :(得分:0)

是的,您可以将多个表指向HDFS上的相同位置。但是,Hive不支持动态列。

有没有理由你不能只有3个不同的表?这将允许您为每个都有不同的模式(列)。

- 布兰登

答案 2 :(得分:0)

回答我自己的问题:

可能有多个hive表由相同的HDFS目录结构表示,但是我想要做的是:

  1. 由logname分区的mytable表(logname = tarzan,logname = jane等...)
  2. 每个logname的单独表:一个“tarzan”表,其中只有tarzan表使用的列,而不是任何其他logname,“jane”表等相同
  3. 仅在HDFS中表示一次数据
  4. 更好的解决方案是使用1 mytable表,按logname分区,并为每个logname表创建视图,每个只需要列的子集。