gpt4 book ai didi

sql - hive :如何将数据从分区表插入到分区表中?

转载 作者:行者123 更新时间:2023-12-02 18:57:49 37 4
gpt4 key购买 nike

这是我之前询问的问题的扩展: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元数据文件创建并存储为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"

典型错误消息:

Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask



更新:

该错误似乎是在SELECT语句中。现在,我可以选择*没问题。但是,当我通过特定列或使用WHERE约束进行SELECT时,我在HUE中遇到了上面的错误。我决定在HIVE CLI中运行相同的命令,我想我可能已经得到了潜在的错误:

摘录自:

org.apache.avro.AvroTypeException: Found long, expecting union



现在,让我感到奇怪的是,我使用修改后的AVRO元数据文件对新表进行了DROP和CREATED操作,并迁移了一个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命令时以某种方式修改了分区文件,该如何解决无法从旧的临时表中进行选择的问题?我是否只用STRING而不是BIGINT运行相同的命令?
**完整错误消息:**

Error: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing writable org.apache.hadoop.hive.serde2.avro.AvroGenericRecordWritable@439b15f2 at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:169) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:465) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:349) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:174) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1731) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:168) Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing writable org.apache.hadoop.hive.serde2.avro.AvroGenericRecordWritable@439b15f2 at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:492) at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:160) ... 8 more Caused by: org.apache.avro.AvroTypeException: Found long, expecting union at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:292) at org.apache.avro.io.parsing.Parser.advance(Parser.java:88) at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267) at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179) at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153) at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:232) at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:222) at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:175) at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153) at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:145) at org.apache.hadoop.hive.serde2.avro.AvroDeserializer$SchemaReEncoder.reencode(AvroDeserializer.java:110) at org.apache.hadoop.hive.serde2.avro.AvroDeserializer.deserialize(AvroDeserializer.java:174) at org.apache.hadoop.hive.serde2.avro.AvroSerDe.deserialize(AvroSerDe.java:220) at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.readRow(MapOperator.java:125) at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.access$200(MapOperator.java:89) at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:483) ... 9 more

最佳答案

您可以尝试的几种方法

  • 我假设新表中的列3是bigint类型,旧表中的字符串,您可以在其中使用colaese并在其中使用colaese,例如colaese(cast(col3 as bigint),0)作为select语句中的col3尝试做同样的事情在所有类型的强制转换列上
  • 尝试插入覆盖

  • 如果您能够查询选择零件,那么插入零件中肯定有问题
    请评论您的更新让我们弄清楚

    关于sql - hive :如何将数据从分区表插入到分区表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58370502/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com