【问题标题】:spark sql load all data into memory without using where clausespark sql 在不使用 where 子句的情况下将所有数据加载到内存中
【发布时间】: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 呢?

【问题讨论】:

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


【解决方案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 子句过滤的数据并加载到数据框中。希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2011-12-07
    相关资源
    最近更新 更多