Hive:创建表和分区依据

时间:2012-12-10 11:48:13

标签: hadoop hive

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

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行无法识别输入' xyzlogTable'在alter table statement

任何想法都是这个问题!

2 个答案:

答案 0 :(得分:6)

这正是我更喜欢在Hive中使用外部表的原因。您创建的表格不是外部的(您使用的是create table而不是create external table)。使用非外部表,删除表,删除HDFS中的元数据(名称,列名,类型等)和表的数据。相反,当删除外部表时,只删除元数据,HDFS中的数据就会消失。

你有几个选择:

  1. 如果导入成本很高且数据尚未分区。保持这个表,但创建一个新的表,说xyzlogTable_partitioned将是该表的分区版本。您可以在Hive中使用Dynamic Partitioning来填充此新表。

  2. 如果导入成本很高但数据已经分区;例如,假设您已经在HDFS中的每个分区的单独文件中有数据。创建一个新的分区表并有一个bash脚本(或等效的),从与未分区表对应的HDFS目录移动(或复制,以后删除,如果你保守的话)到对应于新分区的相应分区的目录表

  3. 如果导入便宜:请删除整个表格。重新创建新的分区表并重新导入。很多时候,如果导入过程不知道分区模式(换句话说,如果导入不能直接将数据推送到适当的分区),那么拥有一个未分区的表(就像你已经拥有的那样)是一个常见的用例。作为临时表,然后使用Hive查询或动态分区来填充新的分区表,该表将在工作流的后续查询中使用。

答案 1 :(得分:1)

您应首先删除已创建的表,然后创建分区表。或者更改您的表名。