Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 配置单元:如何将数据从分区表插入分区表?_Sql_Hadoop_Hive_Cloudera - Fatal编程技术网

Sql 配置单元:如何将数据从分区表插入分区表?

Sql 配置单元:如何将数据从分区表插入分区表?,sql,hadoop,hive,cloudera,Sql,Hadoop,Hive,Cloudera,这是我之前提出的一个问题的延伸: 问题:在Hive 2.1.1中,如何将数据从分区表插入分区表?正确的语法是什么?我在互联网上看到了很多资料,但似乎没有一个是有效的 挫败感:我在同一个主题上发布了太多的问题:如何将现有字符串列中的数据更改为外部表中的BIGINT列,该表由AVRO元数据文件创建并存储为AVRO。所有这些似乎都不起作用。因此,现在我已经用更新的元数据创建了一个重复的*\新表,并且我正在尝试通过从现有表中选择来将现有数据插入到新表中。而且,这是行不通的。我尝试了许多HQL的排列来执行

这是我之前提出的一个问题的延伸:

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

挫败感:我在同一个主题上发布了太多的问题:如何将现有字符串列中的数据更改为外部表中的BIGINT列,该表由AVRO元数据文件创建并存储为AVRO。所有这些似乎都不起作用。因此,现在我已经用更新的元数据创建了一个重复的*\新表,并且我正在尝试通过从现有表中选择来将现有数据插入到新表中。而且,这是行不通的。我尝试了许多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"
典型错误消息:

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"
处理语句时出错:失败:执行错误,返回代码 2来自org.apache.hadoop.hive.ql.exec.mr.MapRedTask

更新:

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"
错误似乎出现在SELECT语句中。现在,我可以选择*没问题。但是,当我通过特定列或使用WHERE约束进行选择时,我在色调中得到了上面的错误。我决定在HIVE CLI中运行相同的命令,我想我可能遇到了潜在的错误:

摘自以下内容:


org.apache.avro.AvroTypeException:发现长,应为联合

现在,让我感到奇怪的是,我确实删除了并使用修改后的AVRO元数据文件创建了新表,并且迁移了一个分区(包含3个文件)。我验证了AVRO元数据文件和分区文件对于Column3具有相同的元数据。但是,在色调中,列的元数据显示为BIGINT。Hive的metastore似乎不是正确的最新版本(我怀疑这是我们所做的所有测试和故障排除的结果)。我怎样才能纠正这个问题

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

问题1:考虑到AVRO文件是正确的,如何修复配置单元中原始表的元数据

问题2:当我运行
ALTER列时,如果分区文件以某种方式被修改,如何修复无法从旧的临时表中进行选择的问题。。。分区(…)更改列Column3 Column3 BIGINT级联
命令?我是否只运行相同的命令,但使用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) 位于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.readwithout转换(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.readwithout转换(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$schemareconder.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.h