Apache Spark JDBC DataFrame计数问题

时间:2017-09-21 07:56:21

标签: 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" -> "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数据帧都会调用。

1 个答案:

答案 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()