梦里的故乡 發表於 2025-11-11 19:23:00

Hive查询报错:java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.LongWritable

<p>&nbsp;</p>
<h3>以下只是说一下解决思路&nbsp; 供大家参考</h3>
<p>以下基于hive的内部表</p>
<p>&nbsp;</p>
<p>Error: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.LongWritable (state=,code=0)</p>
<p>&nbsp;</p>
<p>这个是因为hdfs的存的文件和hive元数据的建表语句对应的字段类型不一样,hdfs文件是字符串类型,但是hive的表字段是数值类型 转换报错了</p>
<p>首先判断一下是哪个字段转换的问题,这个大家自行比较 ,有一个简单的办法就是单独查询每一个字段,</p>
<p>比如 select&nbsp; 字段 from 表;&nbsp; &nbsp;单独查询一个字段是不会报异常的 如果报了 说明就是那个字段有问题</p>
<p>&nbsp;</p>
<p>这个时候我们试过把hive对应的字段的数值类型直接转换成字符串类型(我们试过 但是这种方法即使把hive的字段改为字符串类型了&nbsp;查询也还是不行&nbsp;<em id="__mceDel">)</em></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name STRING;</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>这种数值转字符串类型hive是支持直接转换了但是比如字符串转数值类型 就不行</p>
<p>&nbsp;</p>
<p>最后做法</p>
<p>新建一个字段类型符合hdfs要求的hive表</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">CREATE</span> <span style="color: rgba(0, 0, 255, 1)">TABLE</span><span style="color: rgba(0, 0, 0, 1)"> `ddm.op_111102`(</span><span style="color: rgba(0, 0, 0, 1)">
`d_ip` string COMMENT </span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">dev_ip</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, </span><span style="color: rgba(0, 0, 0, 1)">
`p_user` string COMMENT </span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">primary_user</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
PARTITIONED </span><span style="color: rgba(0, 0, 255, 1)">BY</span><span style="color: rgba(0, 0, 0, 1)"> (
`month` string,
`date` string)
ROW FORMAT SERDE
</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
STORED </span><span style="color: rgba(0, 0, 255, 1)">AS</span><span style="color: rgba(0, 0, 0, 1)"> INPUTFORMAT
</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
OUTPUTFORMAT
</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
LOCATION
</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">hdfs://apps/op</span><span style="color: rgba(255, 0, 0, 1)">'</span></pre>
</div>
<p>以上就是一个简单的建表语句 根据自己的来就行</p>
<p>最主要的就是要把外部表的Location设置为之前对应表有问题的hdfs路径,同时把字段改为符合要求的类型</p>
<p>&nbsp;</p>
<p>然后刷新所有分区&nbsp;&nbsp;</p>
<div class="cnblogs_code">
<pre>MSCK REPAIR <span style="color: rgba(0, 0, 255, 1)">TABLE</span> ddm.op_111102;</pre>
</div>
<p>刷新某个分区</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">ALTER</span> <span style="color: rgba(0, 0, 255, 1)">TABLE</span> op_111102 <span style="color: rgba(0, 0, 255, 1)">ADD</span> PARTITION (month<span style="color: rgba(128, 128, 128, 1)">=</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold">202511</span>, date<span style="color: rgba(128, 128, 128, 1)">=</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">08</span><span style="color: rgba(255, 0, 0, 1)">'</span>);</pre>
</div>
<p>以上是为了加载查询数据&nbsp;</p>
<p>&nbsp;</p>
<p>这样先查询下创建的表是否能够查询刷新分区的数据</p>
<p>select * from 表 ;</p>
<p>这个主要验证是否可以查询到数据,如果可以的话 那说明基本可以了</p>
<p>&nbsp;</p>
<p>剩下的就是把表名重命名下就可以了 把原本有问题的表名换一个,然后这种可以用的表名 重命名为原来的表名即可 (如果需要的话,<span style="color: rgba(255, 0, 0, 1)">注意 内部表这个步骤会导致hdfs的目录 也就是location的变更 数据和迁移</span>)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">ALTER</span> <span style="color: rgba(0, 0, 255, 1)">TABLE</span> db.old_name RENAME <span style="color: rgba(0, 0, 255, 1)">TO</span> db.new_name;</pre>
</div>
<p>只有外部表重命名才不会导致location的变更</p>
<p>也就是&nbsp;<code data-spm-anchor-id="5176.28103460.0.i11.6fd51db88QXfIC">EXTERNAL</code></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">CREATE</span> <span style="color: rgba(255, 0, 0, 1)">EXTERNAL</span> <span style="color: rgba(0, 0, 255, 1)">TABLE</span> external_table (id <span style="color: rgba(0, 0, 255, 1)">INT</span><span style="color: rgba(0, 0, 0, 1)">)
LOCATION </span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">/data/source/from/spark/or/flink</span><span style="color: rgba(255, 0, 0, 1)">'</span>;</pre>
</div>
<p>&nbsp;</p>
<p>改成外部表</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">ALTER</span> <span style="color: rgba(0, 0, 255, 1)">TABLE</span> ass.op <span style="color: rgba(0, 0, 255, 1)">SET</span> TBLPROPERTIES(<span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">EXTERNAL</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(128, 128, 128, 1)">=</span><span style="color: rgba(255, 0, 0, 1)">'</span><span style="color: rgba(255, 0, 0, 1)">TRUE</span><span style="color: rgba(255, 0, 0, 1)">'</span>);</pre>
</div>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
   



-----------------------有任何问题可以在评论区评论,也可以私信我,我看到的话会进行回复,欢迎大家指教------------------------
                         (蓝奏云官网如果有地址失效了,可以私信我,后续看到会补充)<br><br>
来源:https://www.cnblogs.com/pxblog/p/19211371
頁: [1]
查看完整版本: Hive查询报错:java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.LongWritable