我使用spark 2.0.0来查询hive表:
我的sql是:
select * from app.abtestmsg_v limit 10
是的,我想从视图app.abtestmsg_v
获取前10条记录。
当我在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()
以下是我的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()
从信息日志中,我发现: 虽然我用“限制10 ”告诉火花,我只想要前10条记录,但是火花仍然扫描并读取所有文件(在我的例子中,这个视图的源数据包含100个文件,每个文件的大小约为1G),因此,有近100个任务,每个任务读取一个文件,所有任务都是串行执行的。我使用近乎 15分钟来完成这100项任务!!!!!但我想要的只是获得第一个 10 记录。
所以,我不知道该做什么和出了什么问题;
Anybode可以给我一些建议吗?