IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【Spark报错】CDH的spark无法读取字段中含有特殊字符“-“的orc表mismatched input ‘-‘ expecting ‘:‘ -> 正文阅读

[大数据]【Spark报错】CDH的spark无法读取字段中含有特殊字符“-“的orc表mismatched input ‘-‘ expecting ‘:‘

背景故事

先看报错信息:
mismatched input ‘-’ expecting ‘:’
在这里插入图片描述
报错的意思就是说,在这个表里面,字段名中存在特殊符号“-”,无法解析报错。
这个问题会发生在CDHspark中。如果不是CDHspark版本的程序,可以跳过此文章

解决方案:

不要使用CDH版本的spark就好了。比如我这里出现报错的时候,使用的版本是2.4.0-cdh6.1.1 那么把这个版本修改为2.4.0就好了。

过程分析

过程早就分析完了,下面写一篇结果:

环境版本
  • spark-sql_2.11
    2.4.0-cdh6.1.1
  • spark-hive_2.11
    2.4.0-cdh6.1.1

测试数据准备

        SparkSession spark = SparkSession.builder().master("local").getOrCreate();
        ArrayList<Row> rows = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            rows.add(RowFactory.create(1, "张三", 18,"12345678"));
        }
        StructType schema = DataTypes.createStructType(new StructField[]{
                DataTypes.createStructField("id", DataTypes.IntegerType, true),
                DataTypes.createStructField("name", DataTypes.StringType, true),
                DataTypes.createStructField("user-age", DataTypes.IntegerType, true),
                DataTypes.createStructField("number", DataTypes.StringType, true)
        });
        spark.createDataFrame(rows,schema).write().orc("/Users/codes/testspark/src/orc");
        spark.stop();

测试数据样例(当然:
在这里插入图片描述
现在将spark的版本切换为2.4.0-cdh6.1.1开始读取这个数据/Users/codes/testspark/src/orc
果不其然,出现如下所示的报错信息,开始调试这个程序:
在这里插入图片描述
断点打到ParseDriver.scala里面的withCommand的方法
在这里插入图片描述
Ideadebug栏里面看到:
这个user-age字段被解析成了三个内容:user-age.所以是这里出现了问题。
在这里插入图片描述
在非CDH版本的spark当中,这块儿变量会是什么样子呢?如下图所示:
在这里插入图片描述
在这个图里面,user-age被成功解析了,并且套上了一对反引号。
那么,是什么东西造成了这样的不同呢?

核心原因:

原因是在CDHspark中,有一个类org.apache.orc.TypeDescription在解析数据schema的过程中,不能正确识别字段中含有的特殊符号(cdh版本的该类与开源版本相比缺失了一些解析字段名称的方法),也就不能给这些含有特殊符号的字段名称添加一对反引号。导致最后生成的。schema信息过不去词法分析器步骤,所以报错。
具体的原因是在这表的结构信息转换成protobuf格式的时候:
这块地方是cdh版本的spark调用的toString()方法中的printToBuffer()方法里面的详细内容:
在这里插入图片描述
这个是开源版本的:
在这里插入图片描述
这里多调用了一个printFieldName的方法,我们开看看方法:
在这里插入图片描述
这里就是为了给字段名中添加反引号的地方了。
到这里,全部解释完毕了。

总结

原因找到了那么接下来的解决方案就好办了,可以对症下药。写到这里,如果各位大佬有什么更好的建议,请在下方留言:
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-06-04 00:01:46  更:2022-06-04 00:02:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 0:02:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码