hadoop—是否可以在同一个hdfs目录结构中表示多个配置单元表?

bpsygsoo  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(323)

是否可以在同一hdfs目录结构中表示多个配置单元表?换句话说,有没有办法让多个配置单元表指向相同/重叠的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”的配置单元表?与位于hdfs:/tables/mytable/logname=jane等中的配置单元表“jane”相同。
tarzan、jane、whoa等子表共享一些列(timestamp、ip\u address、country、user\u id和其他一些列),但也会有许多它们没有共同点的列。
有没有一种方法可以将这些数据存储在hdfs中一次,然后像我上面描述的那样将其用于多个表?此外,有没有一种方法可以有效地存储数据,因为许多表都有不常见的列?像rcfile或parquet这样的文件格式在这种情况下有效吗?
非常感谢任何人提供的任何提示或帮助,

5q4ezhmt

5q4ezhmt1#

是的,我们可以有多个具有相同基础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 表(文件3的内容)。

create table mirror (id int, name string, salary int) 
row format delimited 
fields terminated by ',' 
location 'hdfs:///user/hive/warehouse/parv.db/base';

将数据加载到 mirror table。当您要从 mirror 表或 emp 表中,它将返回相同的结果(file3和file4的内容)。

load data 
local inpath '/home/parv/testfiles/file4' 
into table mirror;

结论:
两个表之间共享相同的数据文件 emp 以及 mirror .
但是,奇怪的是,hdfs文件系统只显示 emp 表而不是 mirror table。但是,这两个表都存在于配置单元中,因此可以进行查询。

wnavrhmk

wnavrhmk2#

回答我自己的问题:
可以用同一个hdfs目录结构表示多个配置单元表,但我想做的是:
一个用logname(logname=tarzan,logname=jane,等等)划分的mytable表
每个logname都有一个单独的表:一个只有tarzan表使用的列的“tarzan”表,没有任何其他logname,与“jane”表相同,等等
在hdfs中只表示一次数据
一个更好的解决方案是让mytable表按logname分区,并为每个logname表创建视图,每个表中只需要列的子集。

0md85ypi

0md85ypi3#

是的,您可以将多个表指向hdfs上的同一位置。但是,配置单元不支持动态列。
有没有理由你不能只拥有3张不同的table?这将允许您为每个应用程序使用不同的模式(列)。
--布兰登

相关问题