首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用JDBC连接工作?

如何使用JDBC连接工作?
EN

Stack Overflow用户
提问于 2018-07-23 19:09:15
回答 1查看 1.2K关注 0票数 0

我刚开始使用Spark,我正在尝试使用一个spark-jdbc程序来计算数据库中的行数。

我想出了这样的代码:

代码语言:javascript
复制
object PartitionRetrieval {
    var conf  = new SparkConf().setAppName("Spark-JDBC")
    val log   = LogManager.getLogger("Spark-JDBC Program")
    Logger.getLogger("org").setLevel(Level.ERROR)
    val conFile       = "/home/hmusr/ReconTest/inputdir/testconnection.properties"
    val properties    = new Properties()
    properties.load(new FileInputStream(conFile))
    val connectionUrl = properties.getProperty("gpDevUrl")
    val devUserName   = properties.getProperty("devUserName")
    val devPassword   = properties.getProperty("devPassword")
    val driverClass   = properties.getProperty("gpDriverClass")
    val tableName     = "source.bank_accounts"
    try {
    Class.forName(driverClass).newInstance()
    } catch {
    case cnf: ClassNotFoundException =>
        log.error("Driver class: " + driverClass + " not found")
        System.exit(1)
    case e: Exception =>
        log.error("Exception: " + e.printStackTrace())
        System.exit(1)
    }
    def main(args: Array[String]): Unit = {
        val spark   = SparkSession.builder().config(conf).master("yarn").enableHiveSupport().getOrCreate()
        val gpTable = spark.read.format("jdbc").option("url", connectionUrl)
                                                        .option("dbtable",tableName)
                                                        .option("user",devUserName)
                                                        .option("password",devPassword).load()
        val rc = gpTable.filter(gpTable("source_system_name")==="ORACLE").count()
        println("gpTable Count: " + rc)
    }
}

到目前为止,这段代码是有效的。但我对此有两个概念上的疑问。

  1. 在Java中,我们创建一个连接类,并使用该连接查询多个表,并在满足需求后关闭它。但它似乎以另一种方式起作用。如果我必须查询数据库中的10个表,是否应该使用这一行10次,其中包含不同的表名:在Java中,我们创建一个连接类,并使用该连接查询多个表,并在满足要求后关闭它。但它似乎以另一种方式起作用。如果我必须查询数据库中的10个表,是否应该使用这一行10次,并在其中使用不同的表名: val gpTable = spark.read.format("jdbc").option("url",connectionUrl) .option("dbtable",tableName) .option("user",devUserName) .option(“密码”,devPassword).load()
  2. 此处使用的当前表的总行数为2000。我可以相应地使用过滤器/选择/聚合函数。但是在我们的生产中,有数以百万行的表,如果我在上面的语句中放置一个大表,即使我们的需求稍后对它进行过滤,难道不是首先创建一个巨大的数据吗?

有人愿意给我一些关于我上面提到的疑问的见解吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-23 20:02:30

将SQL查询传递给它,首先称为下推到数据库。

例如。

代码语言:javascript
复制
val dataframe_mysql = spark.read.jdbc(jdbcUrl, "(select k, v from sample where k = 1) e", connectionProperties)  

您可以用s“”代替hostvars,也可以按照您的建议构建自己的SQL字符串和重用,但是如果不这样做,这个世界仍然存在。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51485664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档