spark sql将所有数据加载到内存中而不使用where子句

时间:2016-11-25 04:45:25

标签: apache-spark apache-spark-sql spark-dataframe

所以我有一个非常庞大的表包含数十亿行,我尝试使用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?

2 个答案:

答案 0 :(得分:3)

我已经解决了这个问题。 spark spark给出了答案: 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()

答案 1 :(得分:0)

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()