文档首页 > > 开发指南> Spark应用开发> 开发程序> 通过JDBC访问Spark SQL的程序> Scala样例代码

Scala样例代码

分享
更新时间: 2020/03/31 GMT+08:00

功能简介

使用自定义客户端的JDBC接口提交数据分析任务,并返回结果。

样例代码

  1. 定义SQL语句。SQL语句必须为单条语句,注意其中不能包含“;”。示例:

    val sqlList = new ArrayBuffer[String]
    sqlList += "CREATE TABLE CHILD (NAME STRING, AGE INT) " +
    "ROW FORMAT DELIMITED FIELDS TERMINATED BY ','"
    sqlList += "LOAD DATA INPATH '/home/data' INTO TABLE CHILD"
    sqlList += "SELECT * FROM child"
    sqlList += "DROP TABLE child"
    • 样例工程中的data文件需要放到JDBCServer所在机器的home目录下
    • 保证本地的data文件和创建的表的所属的用户和用户组保持一致

  2. 拼接JDBC URL。

    HA模式下url的host和port必须为“ha-cluster”

    普通集群需要将样例代码中com.huawei.bigdata.spark.examples.ThriftServerQueriesTest.scala中第61、62行代码

    val sb = new StringBuilder("jdbc:hive2://ha-cluster/default"

    + securityConfig)

    改为val sb = new StringBuilder("jdbc:hive2://ha-cluster/default");

    val HA_CLUSTER_URL = "ha-cluster"
    val sb = new StringBuilder(s"jdbc:hive2://$HA_CLUSTER_URL/default;")
    val url = sb.toString()

  3. 加载Hive JDBC驱动。

    Class.forName("org.apache.hive.jdbc.HiveDriver").newInstance();

  4. 获取JDBC连接,执行HQL,输出查询的列名和结果到控制台,关闭JDBC连接。

    在网络拥塞的情况下,您还可以设置客户端与JDBCServer连接的超时时间,可以避免客户端由于无限等待服务端的返回而挂起。使用方式如下:

    在执行“DriverManager.getConnection”方法获取JDBC连接前,添加“DriverManager.setLoginTimeout(n)”方法来设置超时时长,其中n表示等待服务返回的超时时长,单位为秒,类型为Int,默认为“0”(表示永不超时)。

    var connection: Connection = null
    var statement: PreparedStatement = null
    try {
      connection = DriverManager.getConnection(url)
      for (sql <- sqls) {
        println(s"---- Begin executing sql: $sql ----")
        statement = connection.prepareStatement(sql)
    
        val result = statement.executeQuery()
    
        val resultMetaData = result.getMetaData
        val colNum = resultMetaData.getColumnCount
        for (i <- 1 to colNum) {
          print(resultMetaData.getColumnLabel(i) + "\t")
        }
        println()
    
        while (result.next()) {
          for (i <- 1 to colNum) {
            print(result.getString(i) + "\t")
          }
          println()
        }
        println(s"---- Done executing sql: $sql ----")
      }
    } finally {
      if (null != statement) {
        statement.close()
      }
    
      if (null != connection) {
        connection.close()
      }
    }

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问