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 子句

在 SPARK SQL 中参数化 Where 子句

如果 where 子句已经修复,如何加快 spark sql 过滤器查询?

如何仅使用在不使用动态SQL的情况下检查的复选框,将WHERE子句设置为在多个位列上进行过滤?

Spark SQL - IN 子句

使用 Spark 读取带有 where 子句的 HBase 表