鸡肋的JdbcRDD

今天准备将mysql的数据倒腾到RDD,很早以前就知道有一个JdbcRDD,就想着使用一下,结果发现却是鸡肋一个。

首先,看看JdbcRDD的定义:

 * An RDD that executes an SQL query on a JDBC connection and reads results.
 * For usage example, see test case JdbcRDDSuite.
 *
 * @param getConnection a function that returns an open Connection.
 *   The RDD takes care of closing the connection.
 * @param sql the text of the query.
 *   The query must contain two ? placeholders for parameters used to partition the results.
 *   E.g. "select title, author from books where ? <= id and id <= ?"
 * @param lowerBound the minimum value of the first placeholder
 * @param upperBound the maximum value of the second placeholder
 *   The lower and upper bounds are inclusive.
 * @param numPartitions the number of partitions.
 *   Given a lowerBound of 1, an upperBound of 20, and a numPartitions of 2,
 *   the query would be executed twice, once with (1, 10) and once with (11, 20)
 * @param mapRow a function from a ResultSet to a single row of the desired result type(s).
 *   This should only call getInt, getString, etc; the RDD takes care of calling next.
 *   The default maps a ResultSet to an array of Object.
 */
class JdbcRDD[T: ClassTag](
    sc: SparkContext,
    getConnection: () => Connection,
    sql: String,
    lowerBound: Long,
    upperBound: Long,
    numPartitions: Int,
    mapRow: (ResultSet) => T = JdbcRDD.resultSetToObjectArray _)

附上个例子:

package test

import java.sql.{Connection, DriverManager, ResultSet}
import org.apache.spark.rdd.JdbcRDD
import org.apache.spark.{SparkConf, SparkContext}

object spark_mysql {
  def main(args: Array[String]) {
    //val conf = new SparkConf().setAppName("spark_mysql").setMaster("local")
    val sc = new SparkContext("local","spark_mysql")

    def createConnection() = {
      Class.forName("com.mysql.jdbc.Driver").newInstance()
      DriverManager.getConnection("jdbc:mysql://192.168.0.15:3306/wsmall", "root", "passwd")
    }

    def extractValues(r: ResultSet) = {
      (r.getString(1), r.getString(2))
    }

    val data = new JdbcRDD(sc, createConnection, "SELECT id,aa FROM bbb where ? <= ID AND ID <= ?", lowerBound = 3, upperBound =5, numPartitions = 1, mapRow = extractValues)

    println(data.collect().toList)

    sc.stop()
  }
}

使用的MySQL表的数据如下:

运行结果如下:

可以看出:JdbcRDD的sql参数要带有两个?的占位符,而这两个占位符是给参数lowerBound和参数upperBound定义where语句的边界的,如果仅仅是这样的话,还可以接受;但悲催的是参数lowerBound和参数upperBound都是Long类型的,,不知道现在作为关键字或做查询的字段有多少long类型呢?不过参照JdbcRDD的源代码,用户还是可以写出符合自己需求的JdbcRDD,这算是不幸中之大幸了。

最近一直忙于炼数成金的spark课程,没多少时间整理博客。特意给想深入了解spark的朋友推荐一位好友的博客http://www.cnblogs.com/cenyuhai/ ,里面有不少源码博文,利于理解spark的内核。

时间: 2025-01-23 00:29:07

鸡肋的JdbcRDD的相关文章

javascript的优美与鸡肋

--总结来自:<javascript语言精粹> 任何语言都有其优美的地方和其鸡肋的地方.避归一些语言的糟粕,能相应的降低bug出现的几率. 优美处: 函数是头等对象 基于原型继承的动态对象 对象字面量和数组字面量 糟粕: 1. 全局变量 全局变量有三种表达方式: var声明:var foo = value; 添加属性到全局对象上,即添加到window上:window.foo = value; 未经声明的变量:foo = value; 虽然变量可以未经声明就使用,但是这会导致后期的很多的bug出

Spark通过JdbcRdd连接Oracle数据库(scala)

一.代码 package com.sgcc.hj import java.sql.DriverManager import org.apache.spark.rdd.JdbcRDD import org.apache.spark.{SparkConf, SparkContext} /** * Created by user on 2016/6/17. */ object JdbcTest { def main(args: Array[String]) { val conf = new Spark

手机厂商为何争相啃智能手环这块“鸡肋”

就像近两日全国各地持续不下的高温一样,一夜之间,智能手环也密集爆发,各个手机厂商争相"下蛋",早前,oppo与百度dulife云联手推出O-band手环,紧接着,华为推出了相当于复杂版蓝牙耳机的荣耀手环,前两日,米4诞生之际顺便生下了相当于手机配件的小米手环.今天中兴也推出自家的蓝牙手环.姗姗来迟的魅族手环将在9月露面,乍看手环市场"很忙",殊不知今日的"香饽饽"忙着成为明日"鸡肋". 智能手环"鸡肋"体现

我所了解的JavaScript糟粕和鸡肋

糟粕 全局变量 众所周知,全局变量在很小的程序中可能会带来方便,但随着程序变得越来大,全局变量将难以处理,全局变量将降低程序的可靠性. 在js中有3种方式定义全局变量 脱离任何函数安排一个var语句   //var foo=value; 直接添加一个属性到全局对象上  //window.foo=value; 直接使用未经声明的变更(其实这叫隐匿全局变量)    //foo=value; 作用域 众所周知,在JavaScript中没有块级作用域,而且在JavaScript有提升变量声明的功能,所以

盲目出炉的支付场景 到底有多少是鸡肋?

当下,花样百出的移动支付已经席卷了大众生活的方方面面.以手机.可穿戴设备等移动智能终端为基础,多个移动支付应用在疯狂地攻城略地,刷足了存在感.尤其是支付宝和微信支付之间的红包大战,彻底点燃了大众使用移动支付的热情.出门不带钱包,手机走遍天下已经成为现实.但移动支付应用似乎还不满足,仍然在支付场景上做文章.不断出炉的支付场景在登上网站头条,让人瞠目结舌的同时,到底有多少是鸡肋? 层出不穷!支付场景炸裂 如果说支付宝和微信支付在红包上的对决是针尖对麦芒,那么在支付场景的拓展上就是各出奇招,总是想搞个

O2O是机遇不是鸡肋,百度O2O的步伐不会停

俗语讲,好事不出门,坏事传千里,而在互联网时代,千里内外也就是即刻之间.互联网时代有一种恶叫危言耸听,有一种哀叫不求甚解,尤其在企业公关层面一恶一哀的相互影响往往都能产生可怕的杀伤力,包括BAT在内也都曾深受其害.例如关于百度放弃O2O这件事,凡是对行业有一定认知或者主动查明传闻起因的都知道这是不可能的事情. O2O是百度的机遇,虽暗箭难防,但不会退缩 对于百度放弃O2O的传闻,这绝对是一个行业热点,但所有正规主流媒体均未跟进这一消息,为何?不是因为谣言止于智者,而是只要对行业有一点了解就都知道

空气净化器这根鸡肋还要啃多久?

这几年雾霾当道,各方治理不利,观望许久后,人们已经不再对有关部门"奢望",而是"自力更生".于是民用空气净化器的时代来了,这个时代因为走得太快,才刚刚进入蓝海就已经变成红海了. 空气净化器是被谁炒起来的? "在家就能享受大自然的清新空气"大概是类似的宣传语打动了消费者的心.空气净化器被从备胎包装了女神.一时之间,空气净化器热潮袭来,一些高端的空气净化器,尽管价格动辄上万,京城各大卖场甚至电商平台却时常断货. 目前市场上的空气净化器品牌有数百个,从

spark2.x由浅入深深到底系列六之RDD java api用JdbcRDD读取关系型数据库

学习任何的spark技术之前,请先正确理解spark,可以参考:正确理解spark 以下是用spark RDD java api实现从关系型数据库中读取数据,这里使用的是derby本地数据库,当然可以是mysql或者oracle等关系型数据库: package com.twq.javaapi.java7; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; imp

Spark JdbcRDD 简单使用

package org.apache.spark.sql.sources import org.apache.spark.SparkContext import java.sql.{ResultSet, DriverManager} import org.apache.spark.rdd.JdbcRDD /** * @author luogankun * Created by spark on 14-12-25. */ object JdbcTest extends App{ val sc =