Apache spark 火花为某些值提供不正确的输出,为某些值提供正确的输出
我在SparkShell中使用ApacheSpark,当我执行SQL查询时,会得到不同的输出 我的spark集群有一个主节点和一个从节点。在主节点上有一个工作节点,在从节点上有一个工作节点。所以我总共有两个工作节点 现在,当我持久化一些数据,然后在每次获得两个不同的输出时对该持久化数据执行一些过滤器时,但这两个不同的输出是不同的,它们不会每次都更改,简言之,我为一个SQL查询获得两个不同的输出 我在主节点和从节点上都有MySQL数据库,其中我有一个表,在从节点上有50000条记录,在主节点上也有50000条记录,这50k+50k记录是不同的,不一样 因此,当我查询时,结果会有所不同。这是我正在尝试的代码,也是输出的屏幕截图Apache spark 火花为某些值提供不正确的输出,为某些值提供正确的输出,apache-spark,apache-spark-sql,spark-dataframe,Apache Spark,Apache Spark Sql,Spark Dataframe,我在SparkShell中使用ApacheSpark,当我执行SQL查询时,会得到不同的输出 我的spark集群有一个主节点和一个从节点。在主节点上有一个工作节点,在从节点上有一个工作节点。所以我总共有两个工作节点 现在,当我持久化一些数据,然后在每次获得两个不同的输出时对该持久化数据执行一些过滤器时,但这两个不同的输出是不同的,它们不会每次都更改,简言之,我为一个SQL查询获得两个不同的输出 我在主节点和从节点上都有MySQL数据库,其中我有一个表,在从节点上有50000条记录,在主节点上也有
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
输出的屏幕截图是
有谁能帮助解决这个问题吗
谢谢正如您可能知道的,Spark进行惰性计算,您这里的问题只是假设
show
将强制计算数据帧
,但这种假设是错误的<代码>显示没有这样的保证,很可能只计算行的子集。要强制计算整个数据帧
,您需要先调用一个动作,比如说,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
都会得到相同的结果正如您可能知道的,Spark进行惰性计算,您的问题只是假设show
将强制计算您的数据帧
,但这种假设是错误的<代码>显示没有这样的保证,很可能只计算行的子集。要强制计算整个数据帧
,您需要先调用一个动作,比如说,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
都会得到相同的结果这意味着datafrme.show不会评估整个数据帧,对吗?谢谢,但我在两台机器上都做了,我在那台机器上拥有的数据,有些数据丢失了,所以我把数据放在了同一边,尝试做同样的事情,结果成功了。这意味着datafrme.show没有评估整个数据帧,对吗?谢谢,但我在两台机器上都做了,我在那台机器上的数据,有些数据丢失了,所以我把数据放在了同一边,试着做同样的事情,结果成功了。