Hive 配置单元:创建外部表:显示分区不起任何作用

Hive 配置单元:创建外部表:显示分区不起任何作用,hive,Hive,我正在自己的数据库中创建一个外部表: create external table test1 ( event_uid string, event_type_id int, event_category_id int, event_date string, log_date string, server string, server_type

我正在自己的数据库中创建一个外部表:

create external table test1 (

event_uid               string,
event_type_id           int,
event_category_id       int,
event_date              string,
log_date                string,
server                  string,
server_type             string,
process_id              int,
device_id               string,
account_id              string,
ip_address              string,
category_id             string,
content_id              string,
entitlement_id          string,
product_id              string,
sku                     string,
title_id                string,
service_id              string,
order_id                bigint,
transaction_id          bigint,
company_code            string,
product_code            string,
key_value_pairs         map<string,string>,
process_run_id          string) 

partitioned by (A string, B string, C string)

location '/data/a1/pnt/lte/formatted/evt'
创建外部表test1(
事件uid字符串,
事件类型id int,
事件\类别\ id int,
事件\u日期字符串,
日志日期字符串,
服务器字符串,
服务器类型字符串,
进程id int,
设备id字符串,
帐户id字符串,
ip_地址字符串,
类别id字符串,
内容id字符串,
授权id字符串,
产品标识字符串,
sku字符串,
title_id字符串,
服务id字符串,
order_id bigint,
事务id bigint,
公司代码字符串,
产品代码字符串,
键\值\对映射,
进程\u运行\u id字符串)
按(A字符串、B字符串、C字符串)分区
位置'/data/a1/pnt/lte/formatted/evt'
当我尝试
SHOW PARTITIONS TEST
时,我只得到OK作为输出。 但是,在另一个数据库中有一个具有相同DDL和相同位置的表,当我执行
显示分区测试时,该表会给出结果。我还尝试了显示分区的MSCK修复表测试


请建议在使用分区时执行DDL时不创建实际分区。分区是在将数据加载到表中时创建的。因此,您需要加载数据,然后才能使用show partitions语句查看分区。

使用分区时,在执行DDL时不会创建实际分区。分区是在将数据加载到表中时创建的。因此,您需要加载数据,然后才能使用show partitions语句查看分区。

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

hive> ALTER TABLE test1 ADD PARTITION (A=2016, B=07, C=19)
hive> LOCATION '/data/a1/pnt/lte/formatted/evt/somedatafor_20160719'
hive> ;
当我们在创建外部表时指定位置“/data/a1/pnt/lte/formatted/evt”(虽然是可选的)时,我们可以利用在该表上执行修复操作的一些优势。因此,当我们想通过一些过程(如ETL)将文件复制到该目录中时,我们可以将分区与外部表同步,而不是编写ALTERTABLE语句来创建另一个新分区

如果我们已经知道HIVE将为下一个数据集创建的分区的目录结构(这里是C=20),那么我们可以简单地将数据文件放在该位置,如“/data/a1/pnt/lte/formatted/evt/A=2016/B=07/C=20/data.txt”并运行如下所示的语句:

hive> MSCK REPAIR TABLE test1;  

上面的语句将分区同步到表“test1”的配置单元元存储。

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

hive> ALTER TABLE test1 ADD PARTITION (A=2016, B=07, C=19)
hive> LOCATION '/data/a1/pnt/lte/formatted/evt/somedatafor_20160719'
hive> ;
当我们在创建外部表时指定位置“/data/a1/pnt/lte/formatted/evt”(虽然是可选的)时,我们可以利用在该表上执行修复操作的一些优势。因此,当我们想通过一些过程(如ETL)将文件复制到该目录中时,我们可以将分区与外部表同步,而不是编写ALTERTABLE语句来创建另一个新分区

如果我们已经知道HIVE将为下一个数据集创建的分区的目录结构(这里是C=20),那么我们可以简单地将数据文件放在该位置,如“/data/a1/pnt/lte/formatted/evt/A=2016/B=07/C=20/data.txt”并运行如下所示的语句:

hive> MSCK REPAIR TABLE test1;  

上面的语句将分区同步到表“test1”的配置单元元存储。

对于外部表,您需要单独添加分区。在这里检查我的答案:谢谢,我已经通过了链接,但我的疑问是:我不认为我必须再次加载数据,因为位置'data/a1/pnt/lte/formatted/evt'已经有了“data”,并且文件实际上遵循结构data/a1/pnt/lte/formatted/evt/A=/B=/C=,我还需要单独添加分区吗?那么,我在创建表时创建的分区会发生什么情况呢?顺便说一句,再次感谢。我试着只加载数据,结果成功了。但我仍然有两个疑问:1)根据外部表创建脚本,如果指定位置,就不需要再次加载数据。为什么在我的情况下,会提示我加载数据?是因为分区吗?请建议2)当我在您提到的线程中采用第二种方法时,我实际上不需要修改表来添加分区。甚至当我尝试添加它时,也会出现以下错误:失败:执行错误,从org.apache.hadoop.hive.ql.exec.ddlstask返回代码1。对于外部表,需要单独添加分区的MetaException(消息:java.lang.NullPointerException)。在这里检查我的答案:谢谢,我已经通过了链接,但我的疑问是:我不认为我必须再次加载数据,因为位置'data/a1/pnt/lte/formatted/evt'已经有了“data”,并且文件实际上遵循结构data/a1/pnt/lte/formatted/evt/A=/B=/C=,我还需要单独添加分区吗?那么,我在创建表时创建的分区会发生什么情况呢?顺便说一句,再次感谢。我试着只加载数据,结果成功了。但我仍然有两个疑问:1)根据外部表创建脚本,如果指定位置,就不需要再次加载数据。为什么在我的情况下,会提示我加载数据?是因为分区吗?请建议2)当我在您提到的线程中采用第二种方法时,我实际上不需要修改表来添加分区。甚至当我尝试添加它时,也会出现以下错误:失败:执行错误,从org.apache.hadoop.hive.ql.exec.ddlstask返回代码1。元异常(消息:java.lang.NullPointe