spark sql 在不使用 where 子句的情况下将所有数据加载到内存中
Posted
技术标签:
【中文标题】spark sql 在不使用 where 子句的情况下将所有数据加载到内存中【英文标题】:spark sql load all data into memory without using where clause 【发布时间】:2016-11-25 04:45:24 【问题描述】:所以我有一个包含数十亿行的非常大的表,我尝试了 Spark DataFrame API 来加载数据,这是我的代码:
sql = "select * from mytable where day = 2016-11-25 and hour = 10"
df = sqlContext.read \
.format("jdbc") \
.option("driver", driver) \
.option("url", url) \
.option("user", user) \
.option("password", password) \
.option("dbtable", table) \
.load(sql)
df.show()
我在mysql中输入了sql,它返回了大约100行,但是上面的sql在spark sql中不起作用,出现OOM错误,似乎spark sql在没有使用where子句的情况下将所有数据加载到内存中。那么如何使用 where 子句触发 sql 呢?
【问题讨论】:
尝试运行这个:df = sqlContext.read \ .format("jdbc") \ .option("driver", driver) \ .option("url", url) \ .option(" user", user) \ .option("password", password) \ .option("dbtable", table) \ .load("select * from mytable").where($"day"==="2016-11 -25" 和 $"hour" === 10) In Apache Spark 2.0.0, is it possible to fetch a query from an external database (rather than grab the whole table)?的可能重复 【参考方案1】:我已经解决了这个问题。 spark doc给出了答案: spark doc
所以关键是改变“dbtalble”选项,让你的sql成为一个子查询。正确答案是:
// 1. write your query sql as a subquery
sql = "(select * from mytable where day = 2016-11-25 and hour = 10) t1"
df = sqlContext.read \
.format("jdbc") \
.option("driver", driver) \
.option("url", url) \
.option("user", user) \
.option("password", password) \
.option("dbtable", sql) \ // 2. change "dbtable" option to your subquery sql
.load(sql)
df.show()
【讨论】:
【参考方案2】:sql = "(select * from mytable where day = 2016-11-25 and hour = 10) as t1"
df = sqlContext.read
.format("jdbc")
.option("driver", driver)
.option("url", url)
.option("user", user)
.option("password", password)
.option("dbtable", sql)
.load(sql)
df.show()
【讨论】:
虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。 @PiotrLabunski 这里 spark SQL 将执行查询并创建一个临时视图为“t1”,其中包含根据 where 子句过滤的数据并加载到数据框中。希望这会有所帮助。以上是关于spark sql 在不使用 where 子句的情况下将所有数据加载到内存中的主要内容,如果未能解决你的问题,请参考以下文章
Spark SQL 中的 where 子句与 join 子句
如果 where 子句已经修复,如何加快 spark sql 过滤器查询?