外部表不会返回其文件夹中的数据

Xor*_*ist 3 hive external cloudera

我在Hive中创建了一个外部表,位于此位置:

CREATE EXTERNAL TABLE tb 
(
...
) 
PARTITIONED BY (datehour INT)
ROW FORMAT SERDE 'com.cloudera.hive.serde.JSONSerDe'
LOCATION '/user/cloudera/data';
Run Code Online (Sandbox Code Playgroud)

数据存在于文件夹中,但是当我查询表时,它不返回任何内容.该表的结构适合数据结构.

SELECT * FROM tb LIMIT 3;
Run Code Online (Sandbox Code Playgroud)

Hive表是否存在一种权限问题:特定用户是否有权查询某些表?你知道一些解决方案或解决方法吗?

Muk*_*h S 8

您已根据列日期时创建表作为分区表,但您将数据放在/ user/cloudera/data中.Hive将在/ user/cloudera/data/datehour =(某个int值)中查找数据.由于它是外部表,因此不会更新Metastore.您需要运行一些alter语句来更新它

以下是带分区的外部表的步骤:

1.)在您的外部位置/ user/cloudera/data中,创建一个目录datehour = 0909201401

                                OR
Run Code Online (Sandbox Code Playgroud)

使用以下方法加载数据:LOAD DATA [LOCAL] INPATH'/ path/to/data/file'INTO TABLE partition(datehour = 0909201401)

2.)创建表后运行alter语句:ALTER TABLE ADD PARTITION(datehour = 0909201401)

希望能帮助到你...!!!


小智 7

当我们创建带有分区的外部表时,我们必须使用给定分区的数据位置来更改外部表。但是,它不必与我们在创建 EXTERNAL TABLE 时指定的路径相同。

hive> ALTER TABLE tb ADD PARTITION (datehour=0909201401)
hive> LOCATION '/user/cloudera/data/somedatafor_datehour'
hive> ;
Run Code Online (Sandbox Code Playgroud)

当我们在创建 EXTERNAL TABLE 时指定 LOCATION '/user/cloudera/data'(尽管它是可选的)时,我们可以利用对该表执行修复操作的一些优势。因此,当我们想要通过 ETL 等过程将文件复制到该目录时,我们可以将分区与 EXTERNAL TABLE 同步,而不是编写 ALTER TABLE 语句来创建另一个新分区。

如果我们已经知道 HIVE 将创建的分区的目录结构,我们可以简单地将数据文件放置在该位置,如“/user/cloudera/data/datehour=0909201401/data.txt”,然后运行如下所示的语句:

hive> MSCK REPAIR TABLE tb;  
Run Code Online (Sandbox Code Playgroud)

上面的语句会将分区同步到表“tb”的 hive 元存储。