1.编写给ResultSet添加spark的schema成员及DF(DataFrame)成员

/*
spark、sc对象因为是全局的,没有导入,需自行定义
teradata的字段类型转换成spark的数据类型
*/ import java.sql.{ResultSet, ResultSetMetaData} import org.apache.spark.sql.types._
import org.apache.spark.sql.{DataFrame, Row} object addDataframeMember { trait ResultSetMetaDataToSchema {
def columnCount: Int def schema: StructType
} implicit def wrapResultSetMetaData(rsmd: ResultSetMetaData) = {
new ResultSetMetaDataToSchema {
def columnCount = rsmd.getColumnCount def schema = {
def tdCovert(tdDpeStr: String, precision: Int = 0, scale: Int = 0, className: String = ""): DataType = {
tdDpeStr match {
case "BYTEINT" => IntegerType
case "SMALLINT" => Integerype
case "INTEGER" => IntegerType
case "BIGINT" => LongType
case "FLOAT" => DoubleType
case "CHAR" => StringType
case "DECIMAL" => DecimalType(precision, scale)
case "VARCHAR" => StringType
case "BYTE" => ByteType
case "VARBYTE" => ByteType
case "DATE" => DateType
case "TIME" => TimestampType
case "TIMESTAMP" => TimestampType
case "CLOB" => StringType
case "BLOB" => BinaryType
case "Structured UDT" => ObjectType(Class.forName(className))
}
} def col2StructField(rsmd: ResultSetMetaData, i: Int): StructField = StructField(rsmd.getColumnName(i), tdCovert(rsmd.getColumnTypeName(i), rsmd.getPrecision(i), rsmd.getScale(i), rsmd.getColumnClassName(i)), rsmd.isNullable(i) match { case 1 => true case 0 => false }).withComment(rsmd.getColumnLabel(i)) def rsmd2Schema(rsmd: ResultSetMetaData): StructType = (1 to columnCount).map(col2StructField(rsmd, _)).foldLeft(new StructType)((s: StructType, i: StructField) => s.add(i)) rsmd2Schema(rsmd)
}
}
} trait ResultSetToDF {
def schema: StructType def DF: DataFrame
} implicit def wrapResultSet(rs: ResultSet) = {
def rsmd = rs.getMetaData def toList[T](retrieve: ResultSet => T): List[T] = Iterator.continually((rs.next(), rs)).takeWhile(_._1).map(r => r._2).map(retrieve).toList def rsContent2Row(rs: ResultSet): Row = Row.fromSeq(Array.tabulate[Object](rsmd.columnCount)(i => rs.getObject(i + 1)).toSeq) new ResultSetToDF {
def schema = rsmd.schema def DF = spark.createDataFrame(sc.parallelize(toList(rsContent2Row)), schema)
} } }

  

2.正常基于JDBC连接并且获得数据集游标

import java.sql.{Connection, DriverManager}

/*
获取TeraData的连接
*/ val (dialect, host, user, passwd, database, charset) = ("teradata", "ip", "user", "password", "database", "ASCII")
val tdConf = collection.immutable.Map(
"driver" -> "com.ncr.teradata.TeraDriver",
"uri" -> s"jdbc:$dialect://$host/CLIENT_CHARSET=EUC_CN,TMODE=TERA,COLUMN_NAME=ON,CHARSET=ASCII,database=$database",
"username" -> user,
"password" -> passwd
) def getTeraConn: Connection = {
Class.forName(tdConf("driver"))
DriverManager.getConnection(tdConf("uri"), tdConf("username"), tdConf("password"))
}
val sql = "SELECT TOP 10 * FROM xxx"
var conn = getTeraConn
val stmt = conn.createStatement()
val rs = stmt.executeQuery(sql)

3.导入隐式转换,调用成员

import addDataframeMember.wrapResultSet
rs.DF.show()

  

JDBC的ResultSet游标转spark的DataFrame,数据类型的映射以TeraData数据库为例的更多相关文章

  1. Spark操作dataFrame进行写入mysql,自定义sql的方式

    业务场景: 现在项目中需要通过对spark对原始数据进行计算,然后将计算结果写入到mysql中,但是在写入的时候有个限制: 1.mysql中的目标表事先已经存在,并且当中存在主键,自增长的键id 2. ...

  2. Spark:将DataFrame写入Mysql

    Spark将DataFrame进行一些列处理后,需要将之写入mysql,下面是实现过程 1.mysql的信息 mysql的信息我保存在了外部的配置文件,这样方便后续的配置添加. //配置文件示例: [ ...

  3. Spark:DataFrame批量导入Hbase的两种方式(HFile、Hive)

    Spark处理后的结果数据resultDataFrame可以有多种存储介质,比较常见是存储为文件.关系型数据库,非关系行数据库. 各种方式有各自的特点,对于海量数据而言,如果想要达到实时查询的目的,使 ...

  4. spark第七篇:Spark SQL, DataFrame and Dataset Guide

    预览 Spark SQL是用来处理结构化数据的Spark模块.有几种与Spark SQL进行交互的方式,包括SQL和Dataset API. 本指南中的所有例子都可以在spark-shell,pysp ...

  5. Oracle使用jdbc调用带游标参数的存储过程

    package com.jckb.procedure; import java.sql.CallableStatement; import java.sql.Connection; import ja ...

  6. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. pandas和spark的dataframe互转

    pandas的dataframe转spark的dataframe from pyspark.sql import SparkSession # 初始化spark会话 spark = SparkSess ...

  8. 【spark】dataframe常见操作

    spark dataframe派生于RDD类,但是提供了非常强大的数据操作功能.当然主要对类SQL的支持. 在实际工作中会遇到这样的情况,主要是会进行两个数据集的筛选.合并,重新入库. 首先加载数据集 ...

  9. [Spark][Python][DataFrame][RDD]DataFrame中抽取RDD例子

    [Spark][Python][DataFrame][RDD]DataFrame中抽取RDD例子 sqlContext = HiveContext(sc) peopleDF = sqlContext. ...

随机推荐

  1. asp.net中的ORA-12154: TNS: 无法解析指定的连接标识符

    本机PL/SQL能正常连接,但是asp.net连接有问题. 临时解决方案: <add key="ConnectString" value="Data Source= ...

  2. sts创建maven项目 引入spring,报错

    症状: Missing artifact org.springframework:spring-core:jar:5.0.0.RC3 原因: 在引入之前没有设置spring版本号 和spring ur ...

  3. 170819-关于JSTL的知识点

    1.JSTL(JSP Standard Tag Library) [1] JSTL简介 > JSTL是JSP的标准标签库 > JSTL为我们提供了一些常用的标签,供我们日常开发使用(if ...

  4. 神坑 Resources.Load 不能实时加载TXT文件

    Resources.Load(fileName) as TextAsset; 这句话并不能实时加载文本文件,对文本文件进行修改之后,若是没有刷新的话,加载的还是之前的文件: 要实时读取文本文件还是要以 ...

  5. ruby file

    E:/AutoTHCN/lib/report/generate_report/web14/20190516/LoanTool.636936123857869205_190516_140514.xlsx ...

  6. WEB开发:Java与Php对比

    比较PHP和JSP这两个Web开发技术,在目前的情况是其实是比较PHP和Java的Web开发.以下是我就几个主要方面进行比较: 一. 语言比较 PHP是解释执行的服务器脚本语言,首先php有简单容易上 ...

  7. Bootstrap,Bagging and Random Forest Algorithm

    Bootstrap Method:在统计学中,Bootstrap从原始数据中抽取子集,然后分别求取各个子集的统计特征,最终将统计特征合并.例如求取某国人民的平均身高,不可能测量每一个人的身高,但却可以 ...

  8. mybatis插件机制及分页插件原理

    MyBatis 插件原理与自定义插件: MyBatis 通过提供插件机制,让我们可以根据自己的需要去增强MyBatis 的功能.需要注意的是,如果没有完全理解MyBatis 的运行原理和插件的工作方式 ...

  9. MyEclipse下Junit报错"The input type of the launch configuration"

    MyEclipse下Junit运行测试用例的时候报错: "The input type of the launch configuration does not exist" 原因 ...

  10. Python模块之pdfkit

    1.安装依赖 pip install python-docx #Python下的Microsoft Word 2007工具 pip install PyPDF2 #Python下的PDF工具 pip ...