火花给某些值的输出不正确,并为某些值输出正确的输出

时间:2017-08-09 09:24:53

标签: apache-spark apache-spark-sql spark-dataframe

当我执行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

输出的屏幕截图是

enter image description here

任何人都可以帮助解决这个问题吗?

由于

1 个答案:

答案 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都应该从现在开始给你相同的结果