Pyspark 查询配置单元非常慢,即使最终结果很小

wuc*_*ang 5 apache-spark apache-spark-sql pyspark

我正在使用 spark 2.0.0 来查询 hive 表:

我的 sql 是:

select * from app.abtestmsg_v limit 10
Run Code Online (Sandbox Code Playgroud)

是的,我想从 view 中获取前 10 条记录app.abtestmsg_v

当我在 spark-shell 中运行这个 sql 时,它非常快,使用大约2 秒

但是当我尝试通过我的 python 代码实现这个查询时,问题就来了。

我使用的是 Spark 2.0.0 并编写了一个非常简单的 pyspark 程序,代码是:

下面是我的 pyspark 代码:

from pyspark.sql import HiveContext
from pyspark.sql.functions import *
import json
hc = HiveContext(sc)
hc.setConf("hive.exec.orc.split.strategy", "ETL")
hc.setConf("hive.security.authorization.enabled",false)
zj_sql = 'select * from app.abtestmsg_v limit 10'
zj_df = hc.sql(zj_sql)
zj_df.collect()
Run Code Online (Sandbox Code Playgroud)

下面是我的 Scala 代码:

val hive = new org.apache.spark.sql.hive.HiveContext(sc)
hive.setConf("hive.exec.orc.split.strategy", "ETL")
val df = hive.sql("select * from silver_ep.zj_v limit 10")
df.rdd.collect()
Run Code Online (Sandbox Code Playgroud)

从信息日志中,我发现:虽然我使用“ limit 10 ”来告诉 spark 我只想要前 10 条记录,但是 spark 仍然扫描并读取所有文件(在我的情况下,此视图的源数据包含 100 个文件和视图的每个文件的大小约为1G),因此,有近100个任务,每个任务读取一个文件,并且所有任务都是串行执行的。我用了将近15 分钟来完成这 100 个任务!!!!!!但我想要的只是获得前10条记录。

所以,我不知道该怎么做,出了什么问题;

任何人都可以给我一些建议吗?