【发布时间】:2020-02-10 16:59:28
【问题描述】:
这是我之前提出的问题的延伸: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 列中的数据更改为由 AVRO 元数据文件创建的外部表上的 BIGINT 列并存储为 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:执行错误,返回码 2 来自 org.apache.hadoop.hive.ql.exec.mr.MapRedTask
更新:
错误似乎出现在 SELECT 语句中。现在,我可以 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:如何在 Hive 中修复原始表的元数据,考虑到 AVRO 文件是正确的?
问题 2:如果在运行 ALTER COLUMN ... PARTITION (...) CHANGE COLUMN Column3 Column3 BIGINT CASCADE 命令时以某种方式修改了分区文件,我该如何解决无法从旧临时表中选择的问题?我是否只运行相同的命令但使用 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 更多
【问题讨论】:
-
错误信息是什么?请将其添加到问题中
-
这不是信息。尝试查找失败任务的 jobtracker 日志
-
@Leftjoin 我知道,很遗憾,我无法访问该站点。我的问题更笼统:执行我要执行的操作的正确语法是什么?
-
语法似乎不错。关于动态分区负载还有很多其他类似的问题,例如 stackoverflow.com/a/55135155/2700344 或 stackoverflow.com/a/55445440/2700344 您需要详细的错误消息才能了解问题所在