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表是否存在一种权限问题:特定用户是否有权查询某些表?你知道一些解决方案或解决方法吗?
您已根据列日期时创建表作为分区表,但您将数据放在/ 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 元存储。