我正在使用Spark JDBC从MS SQL数据库中读取数据,但我得到了一些奇怪的结果。
例如,下面是我从MS SQL数据库中读取记录的代码。 请注意,我正在读取数据的表格不断插入记录。
//Extract Data from JDBC source
val jdbcTable = sqlContext.read.format("jdbc").options(
Map(
"url" -> jdcbUrl,
"driver" -> "net.sourceforge.jtds.jdbc.Driver",
"dbtable" ->
s"(SELECT COLUMNS WITH INNER JOINS WHERE tbl.ID > ${lastExtractUnixTime}) as t"))
.load
println(s"STEP 1] JDBC RECORDS COUNTS ---> ${jdbcTable.count()}")
val updateJdbcDF = jdbcTable
.withColumn("ID-COL1", trim($"COl1"))
.withColumn("ID-COL1", trim($"COl2"))
println(s"STEP 2] UPDATE JDBC RECORDS COUNTS ---> ${updateJdbcDF.count()}")
每次运行程序时,我都会得到2个不同的计数值,例如,我总是得到${updateJdbcDF.count()}
计数> ${jdbcTable.count()}
。
有人能解释我为什么会这样吗?这在我的用例中产生了很多问题。如何在创建jdbcTable
DataFrame后限制其数量。我试过jdbcTable.cache()
但没有运气。
当我在jdbcTable
DataFrame派生的其他数据帧上使用任何操作时,记录会变得越来越大。每当我使用从jdbcTable
数据帧派生的任何数据帧时,jdbcTable
数据帧都会调用。
答案 0 :(得分:1)
我能够通过应用jdbcTable.cache()
来解决这个问题,现在任何从jdbcTable数据框派生的DF都不会给我一个比jdbcTable.count()
更高的计数。现在所有计算都可以。感谢@GPI
//Extract Data from JDBC source
val jdbcTable = sqlContext.read.format("jdbc").options(
Map(
"url" -> jdcbUrl,
"driver" -> "net.sourceforge.jtds.jdbc.Driver",
"dbtable" ->
s"(SELECT COLUMNS WITH INNER JOINS WHERE tbl.ID > ${lastExtractUnixTime}) as t"))
.load
jdbcTable.cache()
println(s"STEP 1] JDBC RECORDS COUNTS ---> ${jdbcTable.count()}")
val updateJdbcDF = jdbcTable
.withColumn("ID-COL1", trim($"COl1"))
.withColumn("ID-COL1", trim($"COl2"))
println(s"STEP 2] UPDATE JDBC RECORDS COUNTS ---> ${updateJdbcDF.count()}")
/**
* MORE DATA PROCESSING HERE
/**
jdbcTable.unpersist()