我有一个加载数据的表如下:
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;
Run Code Online (Sandbox Code Playgroud)
总行数超过300万.一些查询工作正常,一些查询进入无限循环.
看到那个选择后,通过查询分组需要很长时间,有时甚至不返回结果,决定去分区.
但以下两个陈述都失败了:
create table xyzlogTable (datenonQuery string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) partitioned by (dateC string);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
FAILED:Parse Error:第1行第12行无法识别alter table语句中的输入'xyzlogTable'
任何想法都是这个问题!
小智 7
这正是我更喜欢在Hive中使用外部表的原因.您创建的表不是外部的(您使用的是create table代替create external table).使用非外部表,删除表,删除HDFS中的元数据(名称,列名,类型等)和表的数据.相反,当删除外部表时,仅删除元数据,HDFS中的数据会被粘住.
你有几个选择:
如果导入成本很高且数据尚未分区.保持这个表,但创建一个新的表,说xyzlogTable_partitioned将是该表的分区版本.您可以在Hive中使用动态分区来填充此新表.
如果进口成本很高但数据已经分区; 例如,假设您已经在HDFS中的每个分区的单独文件中有数据.创建一个新的分区表并有一个bash脚本(或等效的),从与未分区表对应的HDFS目录移动(或复制,以后删除,如果你保守的话)到对应于新分区的相应分区的目录表.
如果导入便宜:删除整个表.重新创建新的分区表并重新导入.很多时候,如果导入过程不知道分区模式(换句话说,如果导入不能直接将数据推送到适当的分区),那么拥有一个未分区的表(就像你已经拥有的那样)是一个常见的用例.作为临时表,然后使用Hive查询或动态分区来填充新的分区表,该表在工作流的后续查询中使用.