Hive:如何将数据从 PARTITIONED table 插入 PARTITIONED table?

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

这是我之前提出的问题的扩展: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 中,如何将数据从分区 table 插入分区 table?正确的语法是什么?我在整个互联网上看到 material,其中 none 似乎有效。

挫败感: 我在同一主题上发布了太多问题:如何将数据从现有的 STRING 列更改为 table 上的 BIGINT 列是外部的,由 AVRO 元数据文件创建并存储为 AVRO。 None 似乎有效。所以,现在我已经用更新的元数据创建了一个副本 *_new table,我现在正尝试通过 SELECTing 从现有的 [=65] 中将现有数据插入到新的 table 中=].而且,那是行不通的。我尝试了多种 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"

典型错误信息:

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

更新:

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

摘录如下:

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

现在,令我感到奇怪的是,我使用修改后的 AVRO 元数据文件删除并创建了新的 table,并且我迁移了一个分区(包含 3 个文件)。我验证了 AVRO 元数据文件和 PARTITION 文件都具有与 Column3 相同的元数据。但是,在 HUE 中,列的元数据显示为 BIGINT。看来 Hive 的 Metastore 不是最新的(我怀疑这是来自我们所做的所有测试和故障排除)。我该如何纠正?

无论如何,我决定继续使用旧元数据创建一个全新的 table,并在 HDFS CLI 中复制分区文件。在 HUE 中,Column3 的元数据现在正确显示为 STRING。然后我将分区添加到 table。我可以 SELECT * 没问题,但是当我尝试按列或 WHERE 约束 SELECT 时,我仍然遇到上面摘录的相同错误。我想知道是否为分区文件中的所有行更新了 column3 的元数据,而分区文件顶部包含的 AVRO 元数据未更改。我现在有点卡住了,愿意接受想法。

问题 1:如何在 Hive 中修复原始 table 的元数据,考虑到 AVRO 文件是正确的?

问题 2:如果分区文件在我 运行 ALTER COLUMN ... PARTITION (...) CHANGE COLUMN Column3 Column3 BIGINT CASCADE 命令时以某种方式被修改,我如何修复无法从旧临时 table 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) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:349) at org.apache.hadoop.mapred.YarnChild.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.access0(MapOperator.java:89) at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:483) ... 9 more

您可以尝试的东西很少

  1. 我假设第 3 列在您的新 table 中是 bigint 类型,在您的旧 table 中是字符串类型,您可以在其上投射和使用 colaese,例如 colaese (cast( col3 as bigint),0) as col3 in your select statement try do same thing on all your type casted column

  2. 尝试插入覆盖

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