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

Apache spark spark sql不使用where子句将所有数据加载到内存中,apache-spark,apache-spark-sql,spark-dataframe,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

因此,我有一个包含数十亿行的巨大表,我尝试使用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呢

我已经解决了这个问题。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()

我已经解决了这个问题。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()

尝试运行以下命令:df=sqlContext.read\.format(“jdbc”)\.option(“driver”,driver)\.option(“url”,url)\.option(“user”,user)\.option(“password”,password)\.option(“dbtable”,table)\.load(“select*from mytable”)。其中($“day”==“2016-11-25”和$“hour”==10)可能重复尝试运行此操作:df=sqlContext.read\.format(“jdbc”)\.option(“driver”,driver)\.option(“url”,url)\.option(“user”,user)\.option(“password”,password)\.option(“dbtable”,table)\.load(“select*from mytable”)。其中($“day”==“2016-11-25”和$“hour”==10)While的可能重复代码可能会回答问题,提供有关如何和/或为什么解决问题的附加上下文将提高答案的长期值。@Piotralabunski此处spark SQL将执行查询并创建一个临时视图“t1”,其中包含根据where子句过滤的数据并加载到数据框中。希望这会有所帮助。虽然这段代码可能会回答这个问题,但提供有关如何和/或为什么解决问题的附加上下文将提高答案的长期价值。@Piotralabunski此处spark SQL将执行查询并创建一个临时视图“t1”,其中包含根据where子句过滤的数据,并加载到数据框中。希望这会有所帮助。