Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Apache Spark JDBC数据帧计数问题_Apache Spark_Apache Spark Sql_Spark Dataframe_Mssql Jdbc - Fatal编程技术网

Apache spark Apache Spark JDBC数据帧计数问题

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

我正在使用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()}")
每次运行程序时,我都会得到两个不同的计数值,例如,我总是得到
${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(以及扩展后的数据帧)应该是不可变的,但如果它们是由动态数据支持的,它们就不可能是不可变的,我们需要根据其源代码的性质进行相应的编码。