Spark SQL-在HiveContext和DataFrame中运行查询

时间:2018-02-06 10:09:37

标签: scala apache-spark hive apache-spark-sql

我正在探索Spark SQL,并且我一直在尝试使用Hive查询语言(HQL)和DataFrame。前段时间,我进行了一项实验,比较了通过HiveContext和DataFrames运行查询的性能。

我在循环中运行了一个查询

for(i <- 1 to 100){
  val selectQuery : String = s"SELECT * FROM table_1 t1 JOIN table_2 t2 ON t1.col1 = t2.col1 LEFT OUTER JOIN table_3 t3 ON (t1.col1 = t3.col1 and t2.col2 = t3.col2) WHERE t1.col2 = $i"

  hiveContext.sql(s"INSERT INTO resultTable PARTITION(col_res = $i) $selectQuery")
}

它跑了大约4个小时。

然后我在DataFrames中加载了表并将其写在结果表

val t1 = hiveContext.sql("SELECT * FROM table_1")
val t2 = hiveContext.sql("SELECT * FROM table_2")
val t3 = hiveContext.sql("SELECT * FROM table_3")

for(i <- 1 to 100){
  val resultDF = t1.filter(s"col2 === $i").join(t2, "col1").join(t3, Seq("col1", "col2"), "left_outer")

  resultDF.write.mode("append").format("parquet").partitionBy("").saveAsTable(resultTable)
}

其中只运行了一个半小时(我没有缓存或保留DataFrame)。

最初,我认为第一种方式是运行map / reduce作业,因为我在Hive中通过HiveContext运行查询,但显然,这种假设是错误的。

我目前的理论是HiveContext必须在循环中连接到Hive 100次,这是第一种方法消耗这么多时间的原因。

我已经在网上搜寻这个差异背后的原因,但还没找到任何东西。有人可以帮忙解释一下吗?我使用Spark 1.5.0

PS-查询仅用于演示。我不知道它是否真的有效。如果需要更多信息,请告诉我。

修改这个问题是关于代码中观察到的实际差异。我的问题是如果 ,执行时间会有所不同。我的问题是为什么在这个特定场景中存在差异。

0 个答案:

没有答案