GBase 8s
其他
问答

spark适配gbase 8s遇到问题

发表于2025-01-04 15:34:20270次浏览4个评论

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

【GBase版本】:GBase8sV8.8_TL_3.5.1_3X1_3_28a3a6

【操作系统】:CentOS Linux 7

【JDBC版本】:gbasedbtjdbc_3.5.1_3X2_1.jar

【问题描述】*:

     使用sparksql Dataframe API查询gbase数据的返回结果不正确,大体业务逻辑如下:

      存在一张 employees222表,包含字段employee_id,first_name,last_name ,均为varchar类型,包含2条数据。     

     1.使用jdbc demo查询表数据结果正确,截图如下:

         

       核心代码如下(其他均默认):

//连接url
String url = "jdbc:gbasedbt-sqli://localhost:9088/gbasedb:GBASEDBTSERVER=gbaseserver;sqlmode=oracle;DB_LOCALE=zh_CN.utf8;CLIENT_LOCALE=zh_CN.utf8;NEWCODESET=UTF8,utf8,57372;";

//驱动
Class.forName("com.gbasedbt.jdbc.Driver");

//执行查询 SQL
String query = "select * from gbasedb.employees222";  
ResultSet resultSet = statement.executeQuery(query);

     2.使用sparksql Dataframe API查询结果错误(实际2条数据没出来,出来的都是字段名称),截图如下:

        

       核心代码如下(其他均默认):

    val sparkSession = SparkSession  //spark版本3.2.1
      .builder()
      .master("local")
      .appName("testGbase8sApp")
      .getOrCreate()
    val _jdbcUrl = "jdbc:gbasedbt-sqli://localhost:9088/gbasedb:GBASEDBTSERVER=gbaseserver;sqlmode=oracle;DB_LOCALE=zh_CN.utf8;CLIENT_LOCALE=zh_CN.utf8;NEWCODESET=UTF8,utf8,57372;"
    val sql = "select * from gbasedb.employees222"
    val prop = new Properties()
    prop.put("user", "gbasedbt")
    prop.put("password", "93bee552f362e9f7b45094b428241db4")			
    prop.put("driver", "com.gbasedbt.jdbc.Driver")

    val frame = sparkSession.read.jdbc(_jdbcUrl, s"($sql) alias", prop)
//  val frame = sparkSession.read.jdbc(_jdbcUrl, "employees222", prop) //也可以用这个语句,结果一样
    frame.printSchema()
    frame.show()

说明:spark的jdbc也是基于标准jdbc驱动接口实现的,其他数据库比如mysql、pg、oracle以及gbase 8a运行均没有问题。

我们公司正在测试并适配gbase,请问下gbase的大佬们帮忙看下是否是有解决办法?多谢

 

评论

登录后才可以发表评论
ivan发表于 1年前
针对sparksql目前还没遇到这个问题,针对文中提到的问题,我们需要分析下,之后我们会尽快给您一个回复
刺客西毒发表于 1年前
@ivan:好的 谢谢
ivan发表于 1年前
@刺客西毒:你好,经分析,是spark在获取表的结果时会将列信息加入包围符,默认包围符是双引号。gbase8s如果需要支持双引号,需要在jdbc url增加参数DELIMIDENT=Y。
基于上面测试用例已无问题
最佳回答
刺客西毒发表于 1年前
@ivan:非常感谢,你们效率真高,赞!