这是我先前提出的问题的扩展:Is it possible to change an existing column's metadata on an EXTERNAL table that is defined by an AVRO schema file?
问题::在Hive 2.1.1中,如何将数据从分区表插入到分区表中?正确的语法是什么?我在互联网上看到了很多资料,但似乎都没有用。
沮丧:我在同一主题上发布了太多问题:如何将数据从现有的STRING列更改为EXTERNAL并由AVRO元数据文件创建的表上的BIGINT列并存储为AVRO。这些似乎都不起作用。因此,现在我已经使用更新的元数据创建了一个重复的* _new表,并且现在我试图通过从现有表中进行选择来将现有数据插入到新表中。而且,这是行不通的。我尝试了HQL的许多排列来执行此任务,并收到了相应的错误排列。
HQL在火箭科学领域似乎需要PHD ...这个简单的任务应该不会那么困难。
示例查询:
INSERT INTO TableName_New
--PARTITION (partition_year="2000", partition_month="01", partition_date="2000-01-01")
PARTITION (partition_year, partition_month, partition_date)
SELECT Column1, Column2
--,CAST(Column3 AS BIGINT) Column3
,Column3
,partition_year, partition_month, partition_date
--,partition_year, partition_month, partition_date
FROM TableName
WHERE partition_year="2000"
AND partition_month="01"
AND partition_date="2000-01-01"
典型错误消息:
处理语句时出错:FAILED:执行错误,返回代码 2来自org.apache.hadoop.hive.ql.exec.mr.MapRedTask
更新:
该错误似乎在SELECT语句中。现在,我可以选择*没问题。但是,当我通过特定列或使用WHERE约束进行SELECT时,我在HUE中遇到了上面的错误。我决定在HIVE CLI中运行相同的命令,我想我可能已经得到了潜在的错误:
从下面摘录:
org.apache.avro.AvroTypeException:发现的很长,期望会合并
现在,让我感到奇怪的是,我使用修改后的AVRO元数据文件对DROP进行了删除并创建了新表,然后迁移了一个PARTITION(包含3个文件)。我验证了AVRO元数据文件和PARTITION文件对于Column3具有相同的元数据。但是,在HUE中,列的元数据显示为BIGINT。似乎Hive的元存储库不是正确最新的(我怀疑这是来自我们已完成的所有测试和故障排除)。我该如何纠正?
无论如何,我决定继续使用旧的元数据创建一个新表,然后在HDFS CLI中复制分区文件。在HUE中,Column3的元数据现在可以正确显示为STRING。然后,我将分区添加到表中。我可以SELECT *没问题,但是当我尝试按列或WHERE约束进行SELECT时,我仍然遇到上述相同的错误。我想知道分区文件中所有行的column3的元数据是否已更新,而分区文件顶部包含的AVRO元数据没有更改。我现在有点被困住了,并且乐于接受想法。
问题1:考虑到AVRO文件正确,如何在Hive中修复原始表的元数据?
问题2:如果运行ALTER COLUMN ... PARTITION (...) CHANGE COLUMN Column3 Column3 BIGINT CASCADE
命令时对分区文件进行了某种修改,如何解决无法从旧临时表中进行SELECT的问题?我是否只用STRING而不是BIGINT运行相同的命令?
**完整错误消息:**
错误:java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException:Hive运行时错误 在处理可写时 org.apache.hadoop.hive.serde2.avro.AvroGenericRecordWritable@439b15f2 在org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:169) 在org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) 在org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:465) 在org.apache.hadoop.mapred.MapTask.run(MapTask.java:349) 在org.apache.hadoop.mapred.YarnChild $ 2.run(YarnChild.java:174) 在java.security.AccessController.doPrivileged(本机方法) 在javax.security.auth.Subject.doAs(Subject.java:422) 在org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1731) 在org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:168)造成原因:org.apache.hadoop.hive.ql.metadata.HiveException:Hive 处理可写时出现运行时错误 org.apache.hadoop.hive.serde2.avro.AvroGenericRecordWritable@439b15f2 在org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:492) 在org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:160) ...还有8个原因: org.apache.avro.AvroTypeException:找到了很长时间,希望合并 在org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:292) 在org.apache.avro.io.parsing.Parser.advance(Parser.java:88) 在org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267) 在org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179) 在org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153) 在org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:232) 在org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:222) 在org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:175) 在org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153) 在org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:145) 在org.apache.hadoop.hive.serde2.avro.AvroDeserializer $ SchemaReEncoder.reencode(AvroDeserializer.java:110) 在org.apache.hadoop.hive.serde2.avro.AvroDeserializer.deserialize(AvroDeserializer.java:174) 在org.apache.hadoop.hive.serde2.avro.AvroSerDe.deserialize(AvroSerDe.java:220) 在org.apache.hadoop.hive.ql.exec.MapOperator $ MapOpCtx.readRow(MapOperator.java:125) 在org.apache.hadoop.hive.ql.exec.MapOperator $ MapOpCtx.access $ 200(MapOperator.java:89) 在org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:483) ...还有9个
答案 0 :(得分:1)
您可以尝试的几件事
我假设第3列在新表中是bigint类型,在旧表中是字符串,您可以在其中选择并使用colaese,例如colaese(cast(col3 as bigint),0)作为col3在您的选择中语句尝试对所有类型转换列执行相同的操作
尝试插入覆盖
如果您能够查询选择的零件,那么插入零件中肯定有问题 请发表评论,让我们弄清楚