Hive表字段类型转换错误解决:Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.

这篇具有很好参考价值的文章主要介绍了Hive表字段类型转换错误解决:Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 问题场景

假设某有数据的Hive表temp_table的字段状况如下,需要将A字段由string类型转为int类型:

字段名称 字段类型 是否为分区字段
A string
B int
C bigint
D string

1.1 问题发生的背景

在Hdfs数据库中,该表的数据是以Parquet文件格式存储的,包含多个分区。原本在该表中的字段A的类型为int。然而笔者误操作,将该字段的类型转换为了string,即前文所述的表字段状态。

笔者在查询时发现,用HiveSql查询不会报错,而用SparkSql查询本表时,会报如下错误信息:

org.apache.spark.sql.execution.QueryExecutionException: Parquet column cannot be converted in file [文件所在OSS路径]. Column: [has_explicit_source_keys], Expected: StringType, Found: INT32

错误的大致意思为文件中的字段类型和Hive元数据中的字段类型不同,且无法强制转换。
为了继续可以用spark查询本表,笔者尝试修复表字段类型。然而在修复表字段类型时,笔者发现以下两种方法都无法完成操作,并且会报错

1.1 操作方法1

使用如下语句修改Hive表的字段类型时。可能会发现字段可以从string转到Int,但不能从Int转回String。

ALTER TABLE temp_table CHANGE CLOUMN A A int;

1.2 操作方法2

  1. 删除要转换类型的字段A,使原表只剩B、C两个字段。
  2. 新增字段A,将类型转换为int。由于Hive建表时不允许指定列的位置,所以会添加在表的最后。
  3. 将字段A挪到第一位。本步会报错,不允许进行此操作。
-- Step1
ALTER TABLE temp_table replace COLUMNS (B int,C bigint);
-- Step2
ALTER TABLE temp_table ADD COLUMNS (A int);
-- Step3(本步会报错)
ALTER TABLE temp_table CHANGE CLOUMN A A int FIRST;

1.3 报错信息

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. The following columns have types incompatible with the existing columns in their respective positions :
column_name

该错误的意思是,Hive表元数据中已有的字段类型无法被转换为新指定的字段类型。而且结合上述操作方法2可知,如果表中有数据,那么即便删除了某个字段,其字段类型仍然会保留在原来的位置上。

2 问题分析

查看官方文档后,可以了解到,列转换操作是由一个参数控制的:

hive.metastore.disallow.incompatible.col.type.changes 设置为 false 时,Metastore 中的列类型可以从任何类型更改为任何其他类型。 在执行类型更改后,如果新类型可以正确显示数据,则将显示数据。 否则,数据将显示为 NULL。

而hive.metastore.disallow.incompatible.col.type.changes这个参数,在Hive2.0后,默认为True。即在字段类型转换时,不再允许显式转换(强制转换),而是只能进行隐式转换,即由低级类型转换为高级类型。

关于隐式转换的规则,Hive官方文档(需要翻墙后查看该链接)中的说明如下:
Hive表字段类型转换错误解决:Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
本例中的Hive版本为2.7.2
Hive表字段类型转换错误解决:Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.

所以为了实现字段类型的显式转换,需要设置hive.metastore.disallow.incompatible.col.type.changes。

3 解决方法

特别注意:在某些环境下,前两种方法都不能使该参数生效,只能使用第三种方法

3.1 在SQL代码中加参数

在SQL代码最前方加入:set hive.metastore.disallow.incompatible.col.type.changes=false;

3.2 在提交Hive程序时,附加上hiveconf参数

3.3 修改 hive-site.xml文件

在hive 配置文件 hive-site.xml中添加或修改参数:

<property>
<name>hive.metastore.disallow.incompatible.col.type.changes</name>
<value>false</value>
</property>

修改参数之后,需要重启Hive服务才能使参数生效。重启Hive服务后,使用Hive查询该参数值,可以发现修改成功了
Hive表字段类型转换错误解决:Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
同时,可以在DDL语句修改Hive元数据中的字段类型时,实现显式转换。文章来源地址https://www.toymoban.com/news/detail-431916.html

到了这里,关于Hive表字段类型转换错误解决:Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在hive插入数据时出现“Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask”报错

    这个错误代码表明 Hive 作业由于某种原因失败。    1.资源问题: 这个错误可能发生在集群上存在资源约束的情况下,例如内存或 CPU 资源不足以完成 Hive 作业。    2.数据问题: 它可能与数据本身相关。例如,数据可能损坏,或者数据格式或模式存在问题,Hive 无法处理。

    2024年02月05日
    浏览(32)
  • hive插入数据后报错 FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

    hive 插入数据的时候,不能直接运行,报错 错误原因: namenode内存空间不够,JVM剩余内存空间不够新job运行所致 错误提示: Starting Job = job_1594085668614_0006, Tracking URL = http://kudu:8088/proxy/application_1594085668614_0006/ Kill Command = /root/soft/hadoop-3.2.1/bin/mapred job -kill job_1594085668614_0006 Hadoop

    2023年04月15日
    浏览(24)
  • Execution Error, return code 3 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. Spark job faile

    hive on spark 错误Error while processing statement: FAILED: Execution Error, return code 3 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. Spark job failed during runtime. Please check stacktrace for the root cause. 表明Spark任务执行失败,返回了错误代码3。这可能是由于多种原因导致的,例如内存不足、JSON数据格式错

    2024年04月11日
    浏览(38)
  • IDEA 运行hql 出现FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTas

    启用的hiveserver2 的模拟用户功能 ,依赖于Hadoop 提供的proxy user(代理用户功能),只有Hadoop中的代理用户才能模拟其他用户身份访问 Hadoop集群。 因此,需要将hiverserver2 的启动用户设置为 Hadoop 的代理用户 修改hadoop 配置文件 core-site.xml 添加如下配置 重启Hadoop 以及Hive 再次运

    2024年02月11日
    浏览(30)
  • 出现错误(已解决)RuntimeError: CUDA error: no kernel image is available for execution on the device CUDA ker

    为什么把警告po出来,是因为警告可以让我们了解一些有用信息。 首先警告里的内容不可忽略,翻译过来就是NVIDIA RTX GeForce 3060Ti(我使用的服务器)支持的CUDA的算力为8.6,与当前的pytorch的版本不匹配。说白了就是CUDA和pytorch版本不一致。 当前的pytorch版本支持的CUDA的算力为

    2024年02月10日
    浏览(28)
  • Mysql同步到ES时date和time字段类型转换问题解决办法

    这个问题中发生问题的es字段映射类型为date类型!!! 字符串类型的会好很多,关键我这边是通过logstash生成索引,并且全量同步的,不好改索引类型!!! 问题描述: 根据错误日志,似乎是Elasticsearch无法解析日期字段 START_TIME 。这个字段的格式是 YYYY-MM-DD HH:MM:SS ,而Ela

    2024年02月16日
    浏览(29)
  • Hive更改字段类型的正确姿势

    step1 更改表名 step2 创建一个和原来表结构相同的名字 step3 原来数据按分区动态插入

    2024年02月15日
    浏览(29)
  • Electron 开发,报handshake failed; returned -1, SSL error code 1,错误

    在preload.js代码中,暴露参数给渲染线程renderer.js访问,  renderer.js  报:ERROR:ssl_client_socket_impl.cc(978)] failed; returned -1, SSL error code 1,错误 如题所说,跨进程传递消息,这意味着访问将尝试建立一个不安全的连接,而ssl证书验证失败,无法建立连接。 所以我们要做的是: 如何让

    2024年02月14日
    浏览(35)
  • [hive]中的字段的数据类型有哪些

    Hive中提供了多种数据类型用于定义表的字段。以下是Hive中常见的数据类型: 布尔类型(Boolean):用于表示true或false。 字符串类型(String):用于表示文本字符串。 整数类型(Integers):包括TINYINT(1字节整数)、SMALLINT(2字节整数)、INT或INTEGER(4字节整数)、BIGINT(8字节

    2024年02月05日
    浏览(25)
  • MybatisPlus如何完成字段类型转换

    先来回忆下在mybatis中的resultMap作用和是什么 在使用传统的mybatis时,我们一般都会在xml文件定义一个ResultMap 对每个字段都有自己的定义都有两个类型 javaType可以不显式写出来,mybatis可以根据指定的实体类推断出来 jdbcType 也就是对应到数据库中的字段类型 mybatis完成数据库的

    2024年02月04日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包