2

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

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); 

失败:元数据错误:AlreadyExistsException(消息:表 xyzlogTable 已存在)失败:执行错误,从 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”

任何想法是什么问题!

4

2 回答 2

7

这正是我更喜欢在 Hive 中使用外部表的原因。您创建的表不是外部的(您使用create table而不是create external table)。对于非外部表,删除表、删除元数据(名称、列名、类型等)和 HDFS 中表的数据。相反,当一个外部表被删除时,只有元数据被删除,HDFS 中的数据仍然存在。

你有几个选择:

  1. 如果导入成本很高并且数据已经没有分区。保留此表,但创建一个新表,例如 xyzlogTable_partitioned,它将是此表的分区版本。您可以使用Hive 中的动态分区来填充这个新表。

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

  3. If import is cheap: drop the entire table. Re-create a new partitioned table and re-import. Many times if the import process is not aware of the partitioning schema (in other words, if the import can't directly push data into appropriate partitions), it's a common use case to have an unpartitioned table (like the one you already have) as a staging table and then use a Hive query or dynamic partitioning to populate a new partitioned table which gets used in subsequent queries of the workflow.

于 2012-12-10T22:51:51.327 回答
1

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

于 2012-12-10T12:06:32.043 回答