配置单元:如何将数据从分区表插入分区表中?

问题描述 投票:0回答:1

这是我问的先前问题的扩展: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中,如何将数据从分区表插入到分区表中?正确的语法是什么?我在网上看到了所有资料,但似乎都没有用。

Frustration:我在同一主题上发布了太多问题:如何将数据从现有的STRING列更改为EXTERNAL并由AVRO元数据文件创建并存储为AVRO的表上的BIGINT列。这些似乎都不起作用。因此,现在我用更新的元数据创建了一个重复的* _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"

典型错误消息:

处理语句时出错:失败:执行错误,返回代码2来自org.apache.hadoop.hive.ql.exec.mr.MapRedTask

更新:

错误似乎在SELECT语句中。现在,我可以选择*没问题。但是,当我通过特定列或使用WHERE约束进行选择时,我在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:

错误: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个

sql hadoop hive cloudera
1个回答
0
投票

您可以尝试的几种方法

  1. 我假设新表中的第3列是bigint类型,而旧表中的字符串,则可以在您的select语句中将colaese像colaese(cast(col3 as bigint),0)那样转换为colaese并尝试在其中使用colese在所有类型转换列上执行相同的操作]]

  2. 尝试插入覆盖

  3. 如果您能够查询所选零件,则插入零件中肯定有问题请评论您的更新让我们弄清楚

© www.soinside.com 2019 - 2024. All rights reserved.