以两种不同方式创建的相同 Spark Dataframe 在同一查询中获得不同的执行时间

Same Spark Dataframe created in 2 different ways gets different execution times in same query

我以两种方式创建了相同的 Spark Dataframe,以便 运行 Spark SQL 在其上。

1. 我使用以下命令将 .csv 文件中的数据直接读取到 Spark shell 中的 Dataframe 中:

val df=spark.read.option("header",true).csv("C:\Users\Tony\Desktop\test.csv")

2. 我从同一个 .csv 文件在 MongoDB 中创建了一个集合,然后使用 Spark-MongoDB 连接器,我将其导入为将 RDD 转换为 Spark,然后使用以下命令(在 cmd/spark-shell 中)将其转换为 Dataframe:

spark-shell --conf "spark.mongodb.input.uri=mongodb://127.0.0.1/myDb.myBigCollection" --packages org.mongodb.spark:mongo-spark-connector_2.12:3.0.1

import com.mongodb.spark._
val rdd = MongoSpark.load(sc)
val df = rdd.toDF()

之后,我使用以下命令在任一情况下创建了数据框的视图:

df.createOrReplaceTempView("sales")

然后我 运行 在两个 Dataframe 上执行相同的查询,但执行时间却大不相同。在下面的示例中,创建数据帧的第一种方法的执行时间比第二种方法快 4-5 倍。

spark.time(spark.sql("SELECT Region, Country, `Unit Price`, `Unit Cost` FROM sales WHERE `Unit Price` > 500 AND `Unit Cost` < 510 ORDER BY Region").show())

数据库有 100 万个条目,结构如下:

id: 61a6540c3838fe02b81e5338
Region: "Sub-Saharan Africa"
Country: "South Africa"
Item Type:  "Fruits"
Sales Channel: "Offline"
Order Priority: "M"
Order Date: 2012-07-26T21:00:00.000+00:00
Order ID: 443368995
Ship Date: 2012-07-27T21:00:00.000+00:00
Units Sold: 1593
Unit Price: 9.33
Unit Cost: 6.92
Total Revenue: 14862.69
Total Cost: 11023.56
Total Profit: 3839.13

我的问题是我必须使用连接器从 Mongodb 获取 Dataframe 但为什么会这样?

Spark 经过优化以在 Dataframes 上执行得更好。在您的第二种方法中,您首先阅读 RDD,然后将其转换为 Dataframe,这肯定有成本。

而是尝试直接从 Mongo 数据库读取数据作为数据帧。可以参考如下语法:

df = sqlContext.read.format("com.mongodb.spark.sql.DefaultSource").option("uri", "mongodb://127.0.0.1/mydb.mycoll").load()

答案是,在第二种情况下,需要额外的时间才能在执行查询之前将数据从mongodb传输到Spark。