繁体   English   中英

Hive:如何将数据从分区表插入分区表?

[英]Hive: How do I INSERT data FROM a PARTITIONED table INTO a PARTITIONED table?

这是我之前提出的问题的扩展: 是否可以更改由 AVRO 模式文件定义的 EXTERNAL 表上现有列的元数据?

**问题:** 在 Hive 2.1.1 中,如何将数据从分区表插入分区表? 什么是正确的语法? 我在互联网上看到了所有材料,但似乎没有一个有效。

**沮丧:**我在同一主题上发布了太多问题:如何将现有 STRING 列中的数据更改为外部表上的 BIGINT 列,该表由 AVRO 元数据文件创建并存储为 AVRO。 这些似乎都不起作用。 所以,现在我创建了一个带有更新元数据的重复 *_new 表,我现在正尝试通过从现有表中选择来将现有数据插入到新表中。 而且,这是行不通的。 我已经尝试了 HQL 的多种排列来执行此任务,并收到了相应的错误排列。

HQL 似乎需要火箭科学博士学位……这个简单的任务不应该那么困难。

示例查询:

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:执行错误,从 org.apache.hadoop.hive.ql.exec.mr.Map 返回代码 2

**更新: **

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

**摘自以下:**

org.apache.avro.AvroTypeException:发现很长,期待联合

现在,让我感到奇怪的是,我使用修改后的 AVRO 元数据文件进行了 DROP 并创建了新表,并且我迁移了一个 PARTITION(包含 3 个文件)。 我验证了 AVRO 元数据文件和 PARTITION 文件对于 Column3 具有相同的元数据。 但是,在 HUE 中,列的元数据显示为 BIGINT。 Hive 的元存储似乎不是最新的(我怀疑这是来自我们所做的所有测试和故障排除)。 我该如何纠正?

无论如何,我决定提前 go 并使用旧元数据创建一个全新的表,并在 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? **完整的错误信息:**

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) 在 org.apache.hadoop.ma pred.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.Z0238775C7BD96E2EAB98038A FE0C4279Z.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.ZB6EFD606D118D0F6CCZaverro。 icDatumReader.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) 在 org.apache.hadoop.Z8A4AC216FB230D A3834DE641B3E5D0F7Z.ql.exec.MapOperator$MapOpCtx.access$200(MapOperator.java:89) at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:483)... 9 more

您可以尝试的事情很少

  1. 我假设第 3 列在您的新表中是 bigint 类型,在旧表中是字符串,您可以在其上强制转换和使用 colaese,例如在您的 select 语句中使用 colaese (cast(col3 as bigint),0) as col3 尝试做同样的事情你所有的类型铸造列

  2. 尝试插入覆盖

如果您能够查询 select 部分,那么插入部分肯定有问题 请评论您的更新让我们弄清楚

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM