Apache spark Apache Spark JDBC数据帧计数问题
我正在使用Spark JDBC从MS SQL数据库读取数据,但我得到了一些奇怪的结果 例如,下面是我从MS SQL数据库读取记录的代码。 请注意,我从中读取数据的表格中不断插入记录Apache spark Apache Spark JDBC数据帧计数问题,apache-spark,apache-spark-sql,spark-dataframe,mssql-jdbc,Apache Spark,Apache Spark Sql,Spark Dataframe,Mssql Jdbc,我正在使用Spark JDBC从MS SQL数据库读取数据,但我得到了一些奇怪的结果 例如,下面是我从MS SQL数据库读取记录的代码。 请注意,我从中读取数据的表格中不断插入记录 //Extract Data from JDBC source val jdbcTable = sqlContext.read.format("jdbc").options( Map( "url" -> jdcbUrl, "driver" -> "ne
//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()}")
每次运行程序时,我都会得到两个不同的计数值,例如,我总是得到${updateJdbcDF.count()}
count>${jdbcTable.count()}
谁能解释一下为什么会这样?这在我的用例中产生了很多问题。如何在创建数据帧后限制jdbcTable
数据帧的计数。我尝试了jdbcTable.cache()
,但没有成功
当我在从
jdbcTable
dataframe派生的其他数据帧上使用任何操作时,记录变得越来越大。每次使用从jdbcTable
dataframe派生的任何数据帧时,jdbcTable
dataframe都会调用数据帧。我可以通过应用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()
差是常数吗?还是每次两条语句的计数都不一样?@Philantrove No difference不是常数,我每次的计数都不一样..如果“我从中读取数据的表不断插入记录”,并且您的请求没有定义固定范围谓词,那么每次sparks访问表时,表中的行数都是不同的。所以你所看到的(改变计数)只是意料之中的事,不是吗?@GPI,好的,这意味着如果我的谓词不存在,那么每当我使用从jdbcTable数据帧派生的任何数据帧时,就会有一个火花从数据库中再次读取,并且总是给我更高的计数,对吗??实际上,这是我从代码中观察到的,jdbcTable是第一个DF,当我添加一些列并创建另一个DF(如updateJdbcDF)时;当spark重新读取表格时,计数增加。@nilesh1212这是一个“灰色”区域。Spark将“尽最大努力”不重新计算任何可以避免的RDD/数据帧(甚至允许您缓存它们)。但如果它必须重新计算尚未缓存的部分执行图,它将返回到数据存储(通过JDBC的数据库、HDFS上的拼花文件等)。这与我们可以做出的一些基本假设有什么冲突:RDD(以及扩展后的数据帧)应该是不可变的,但如果它们是由动态数据支持的,它们就不可能是不可变的,我们需要根据其源代码的性质进行相应的编码。