我在Hive中创建了一个外部表,位于此位置:
CREATE EXTERNAL TABLE tb
(
...
)
PARTITIONED BY (datehour INT)
ROW FORMAT SERDE 'com.cloudera.hive.serde.JSONSerDe'
LOCATION '/user/cloudera/data';
数据存在于文件夹中,但是当我查询表时,它什么都不返回。该表的结构使其适合数据结构。
SELECT * FROM tb LIMIT 3;
Hive表是否存在一种权限问题:特定用户是否有权查询某些表? 你知道一些解决方案或解决方法吗?
答案 0 :(得分:6)
您已根据 datehour 列创建了分区表表,但是您将数据放在 / user / cloudera / data 中。 Hive将在 / user / cloudera / data / datehour =(某个int值)中查找数据。由于它是外部表,因此不会更新Metastore。您需要运行一些alter语句来更新
以下是带分区的外部表的步骤:
1。)在您的外部位置 / user / cloudera / data 中,创建一个目录 datehour = 0909201401
OR
使用以下方式加载数据:LOAD DATA [LOCAL] INPATH'/ path / to / data / file'INTO TABLE partition(datehour = 0909201401)
2.。)创建表后运行alter语句: ALTER TABLE ADD PARTITION(datehour = 0909201401)
希望它有所帮助...... !!!
答案 1 :(得分:1)
当我们创建带有PARTITION的EXTERNAL TABLE时,我们必须使用给定分区的数据位置来更改EXTERNAL TABLE。但是,它不必与创建EXTERNAL TABLE时指定的路径相同。
hive> ALTER TABLE tb ADD PARTITION (datehour=0909201401)
hive> LOCATION '/user/cloudera/data/somedatafor_datehour'
hive> ;
当我们在创建EXTERNAL TABLE时指定LOCATION'/ user / cloudera / data'(尽管它是可选的)时,我们可以利用对该表进行修复操作的一些优势。因此,当我们想通过诸如ETL之类的过程将文件复制到该目录中时,我们可以使该分区与EXTERNAL TABLE同步,而不必编写ALTER TABLE语句来创建另一个新分区。
如果我们已经知道HIVE将创建的分区的目录结构,我们可以简单地将数据文件放置在该位置,例如“ /user/cloudera/data/datehour=0909201401/data.txt”,然后将语句运行为如下所示:
hive> MSCK REPAIR TABLE tb;
上面的语句会将分区同步到表“ tb”的配置单元存储。