蜂巢:创建表和分区通过(Hive: Create Table and Partition By)

2019-08-03 19:32发布

我有一个加载的数据如下表:

create table xyzlogTable (dateC string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' with serdeproperties( "input.regex" = "(\\S+)\\t(\\d+):(\\d+):(\\d+)\\t(\\S+)\\t(\\S+)\\t(\\S+)\\t(\\S+)", "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s") stored as textfile;

load data local inpath '/home/hadoop/hive/xyxlogData/' into table xyxlogTable;

总行数被发现是超过300万。 一些查询做工精细,有的陷入无限循环。

眼见选择,通过采取长的时间,有时甚至没有返回结果的查询后,决定去划分。

但以下两个语句失败:

create table xyzlogTable (datenonQuery string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) partitioned by (dateC string); 

FAILED:错误在元数据:AlreadyExistsException(消息:表xyzlogTable已经存在)FAILED:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1

Alter table xyzlogTable (datenonQuery string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) partitioned by (dateC string);

失败:分析错误:行1:12不能在ALTER TABLE语句识别输入的“xyzlogTable”

任何想法什么的问题!

Answer 1:

这正是为什么我喜欢在蜂房使用外部表。 您所创建的表不是外部的(你使用create table ,而不是create external table )。 与非外部表,删除表,滴剂中的元数据(名称,列名,类型等),并在HDFS表的数据。 相反,当外部表被删除,仅元数据被删除,在HDFS数据支左右。

您有几种选择前进:

  1. 如果进口的成本高,数据已经不分区。 请记住这台左右,但创建一个新表说xyzlogTable_partitioned,这将是该表的分区版本。 您可以使用动态分区的蜂巢填充这个新表。

  2. 如果进口货物的成本高,但该数据已经被分区; 例如说,你已经在单独的文件数据在HDFS每个分区。 从对应于未分区表对应于新的合适的分区目录中的HDFS目录中创建一个新的分区表,并有一个bash脚本(或同等学历),移动(或复制,之后再删除,如果你是保守的)表。

  3. 如果进口便宜:删除整个表。 重新创建一个新的分区表并重新导入。 很多时候,如果导入过程是不知道分区架构的(换句话说,如果进口不能直接将数据推送到适当的分区),这是一个常见的情况有一个未分区表(像你已经有一个)作为一个临时表,然后使用蜂巢查询或动态分区来填充它获取工作流的后续查询使用一个新的分区表。



Answer 2:

你应该先删除这是已经创建了表,然后创建分区表。 或更改你的表名。



文章来源: Hive: Create Table and Partition By
标签: hadoop hive