以两种不同方式创建的相同 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。
我以两种方式创建了相同的 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。