【问题标题】:Hive: How do I INSERT data FROM a PARTITIONED table INTO a PARTITIONED table?Hive:如何将数据从分区表插入分区表?
【发布时间】: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/2700344stackoverflow.com/a/55445440/2700344 您需要详细的错误消息才能了解问题所在

标签: sql hadoop hive cloudera


【解决方案1】:

你可以尝试一些事情

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

  2. 尝试插入覆盖

如果可以查询到选择部分,那么插入部分肯定有问题 请评论您的更新让我们弄清楚

【讨论】:

  • 我已经更新了我的问题并提供了更多详细信息。
  • Hive 运行时错误同时处理可写 org.apache.hadoop.hive.serde2.avro.AvroGenericRecordWritable@439b15f2 是罪魁祸首。可以查询select语句吗
  • org.apache.avro.AvroTypeException:发现很长,期待联合在。你确定数据没有损坏你可以执行一个查询来执行 MR 任务,比如 groupby 或其他什么
  • 我可以做到SELECT *,但SELECT DISTINCT Column3SELECT * FROM Table WHERE <PartitionColumnConstraintsHere> 都不行。
  • 文件中的数据不正确。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 2018-01-03
  • 2018-07-11
  • 1970-01-01
  • 2019-02-16
  • 2023-04-02
相关资源
最近更新 更多