【发布时间】:2018-07-24 17:52:27
【问题描述】:
我是 Spark 的新手,我正在尝试使用 spark-jdbc 程序来计算数据库中的行数。
我想出了这个代码:
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)
}
}
到目前为止,此代码正在运行。但我对此有两个概念上的怀疑。
-
在 Java 中,我们创建一个连接类并使用该连接来查询多个表,并在满足我们的要求后关闭它。但它似乎以不同的方式工作。 如果我必须查询数据库中的 10 个表,我是否应该使用该行 10 次并在其中使用不同的表名: 在 Java 中,我们创建一个连接类,并使用该连接来查询多个表,并在满足我们的要求后关闭它。但它似乎以不同的方式工作。 如果我必须查询数据库中的 10 个表,我是否应该在其中使用不同表名的这一行 10 次:
val gpTable = spark.read.format("jdbc").option("url", connectionUrl) .option("dbtable",tableName) .option("user",devUserName) .option("password",devPassword).load() -
这里使用的当前表总共有 2000 行。我可以相应地使用过滤器/选择/聚合函数。 但是在我们的生产中有几百万行的表,如果我在上面的语句中放了一个巨大的表,即使我们的要求稍后过滤了它,难道不是先创建一个巨大的数据框吗?
李>
有人愿意就我上面提到的疑问给我一些见解吗?
【问题讨论】:
-
进展如何?
-
很好,我的朋友????
-
SO 是一个很好的网站——尽管人们可以在网络上阅读到那里的批评
-
我同意你的意见,先生
标签: apache-spark