hive:如何将分区表中的数据插入到分区表中?

r7xajy2e  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(732)

这是我之前提出的问题的扩展:是否可以更改由avro模式文件定义的外部表上现有列的元数据?
问:在Hive2.1.1中,如何将分区表中的数据插入分区表?正确的语法是什么?我在网上看到过很多资料,但似乎都不管用。
挫败感:我在同一个主题上提出了太多的问题:如何将现有字符串列中的数据更改为外部表中的bigint列,该表由avro元数据文件创建并存储为avro。这些似乎都不管用。因此,现在我已经用更新的元数据创建了一个重复的*\u新表,并且我正在尝试通过从现有表中选择来将现有数据插入到新表中。而且,这是行不通的。我尝试了许多hql的排列来执行这个任务,并收到了相应的错误排列。
hql似乎需要火箭科学博士学位。。。这个简单的任务不应该那么困难。
示例查询:

  1. INSERT INTO TableName_New
  2. --PARTITION (partition_year="2000", partition_month="01", partition_date="2000-01-01")
  3. PARTITION (partition_year, partition_month, partition_date)
  4. SELECT Column1, Column2
  5. --,CAST(Column3 AS BIGINT) Column3
  6. ,Column3
  7. ,partition_year, partition_month, partition_date
  8. --,partition_year, partition_month, partition_date
  9. FROM TableName
  10. WHERE partition_year="2000"
  11. AND partition_month="01"
  12. AND partition_date="2000-01-01"

典型错误消息:
处理语句时出错:失败:执行错误,从org.apache.hadoop.hive.ql.exec.mr.mapredtask返回代码2
更新:
错误似乎出现在select语句中。现在,我可以选择没问题。但是,当我通过一个特定的列或者使用where约束进行选择时,我得到了上面的色调错误。我决定在hive cli中运行相同的命令,我想我可能遇到了潜在的错误:
摘录如下:
org.apache.avro.avrotypeexception:找到long,应为union
现在,让我感到奇怪的是,我确实删除并使用修改后的avro元数据文件创建了新表,并且迁移了一个分区(包含3个文件)。我验证了avro元数据文件和分区文件对于column3具有相同的元数据。但是,在hue中,列的元数据显示为bigint。似乎hive的metastore不是正确的最新版本(我怀疑这是我们所做的所有测试和故障排除的结果)。我怎样才能纠正这个问题?
不管怎样,我决定继续使用旧的元数据创建一个全新的表,并在hdfscli中复制分区文件。在hue中,column3的元数据现在正确地显示为string。然后我将分区添加到表中。我可以选择
没问题,但当我尝试选择“按列”或“where”约束时,仍然会遇到上述相同的摘录错误。我想知道column3的元数据是否为分区文件中的所有行进行了更新,而分区文件顶部包含的avro元数据是否没有更改。我现在有点困住了,对想法持开放态度。
问题1:考虑到avro文件是正确的,如何在配置单元中修复原始表的元数据?
问题2:如果在运行temp时分区文件被修改了,如何修复无法从旧temp表中进行选择的问题 ALTER COLUMN ... PARTITION (...) CHANGE COLUMN Column3 Column3 BIGINT CASCADE 命令?我是否只运行相同的命令,但使用string而不是bigint完整错误消息:
错误:java.lang.runtimeexception:org.apache.hadoop.hive.ql.metadata.hiveexception:处理可写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)位于javax.security.auth.subject.doas(subject)的java.security.accesscontroller.doprivileged(本机方法)。java:422)在org.apache.hadoop.security.usergroupinformation.doas(用户组信息。java:1731)在org.apache.hadoop.mapred.yarnchild.main(yarnchild。java:168)原因:org.apache.hadoop.hive.ql.metadata.hiveexception:处理可写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:found long,应为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(反序列化)。java:174)在org.apache.hadoop.hive.serde2.avro.avroserde。java:220)在org.apache.hadoop.hive.ql.exec.mapoperator$mapopctx.readrow(mapoperator。java:125)在org.apache.hadoop.hive.ql.exec.mapopOperator$mapopctx.access$200(mapopOperator)。java:89)在org.apache.hadoop.hive.ql.exec.mapoperator.process(mapoperator。java:483) ... 9个以上

pnwntuvh

pnwntuvh1#

你可以尝试的事情很少
我假设列3在新表中是bigint类型,在旧表中是string,您可以对其强制转换并使用colaese,比如在select语句中使用colaese(cast(col3 as bigint),0)作为col3,尝试对所有类型强制转换的列执行相同的操作
尝试插入覆盖
如果你能够查询选择的部分,那么一定有问题,在插入部分请评论你更新让我们弄清楚

相关问题