当我执行SQL查询时,我正在使用spark-shell中的Apache spark我得到不同的输出
我的火花星团有一个主节点和一个从节点。在主服务器上,有一个工作服务器,在从服务器节点上,有一个工作服务器。所以我总共有两个工作节点。
现在当我持久保存一些数据,然后每次我得到两个不同的输出时对这些持久数据执行一些过滤,但这两个不同的输出是不同的,它们每次都不会改变,简而言之,我得到两个不同的输出一个SQL查询。
我在主节点和从节点上都有MySQL数据库,其中我有一个表在其上有50000条记录,在主机上也有50000条记录,这50k + 50k记录不同,不一样。
因此,当我查询时,结果会有所不同。这是我正在尝试的代码,也是输出的截图。
spark-shell --conf spark.sql.warehouse.dir=C:\spark-warehouse --master spark://192.168.0.31:7077
val jdbcDF = spark.read.format("jdbc").options( Map("url" -> "jdbc:mysql://localhost:3306/cmanalytics?zeroDateTimeBehavior=convertToNull&user=root&password=root", "dbtable" -> "cmanalytics.demo_call", "fetchSize" -> "1000", "partitionColumn" -> "newpartition", "lowerBound" -> "0", "upperBound" -> "4", "numPartitions" -> "4")).load()
jdbcDF.createOrReplaceTempView("demo_call")
val sqlDF = sql("select * from demo_call").persist(org.apache.spark.storage.StorageLevel.DISK_ONLY)
sqlDF.show()
val d = sqlDF.filter(sqlDF("campaign_id")===141).groupBy("classification_id").count
d.count
输出的屏幕截图是
任何人都可以帮助解决这个问题吗?
由于
答案 0 :(得分:1)
正如您可能已经知道的那样,Spark会进行懒惰的评估,而您的问题仅仅在于您认为show
会强制评估您的DataFrame
,但这种假设是错误的。 show
没有这样的保证,很可能只评估行的子集。要强制评估整个DataFrame
,您需要先调用count
之类的操作。
val sqlDF = sql("sql("select count(*) from demo_call where classification_id = 141").persist(org.apache.spark.storage.StorageLevel.DISK_ONLY)").persist(org.apache.spark.storage.StorageLevel.DISK_ONLY)
sqlDF.count // to force evaluation
每次拨打show
都应该从现在开始给你相同的结果