使用有序键对Spark SQL数据帧进行高效过滤

时间:2016-10-19 10:55:25

标签: apache-spark apache-spark-sql apache-spark-dataset

我有一个包含“key”列的Spark SQL数据帧。我想要运行的查询首先按键范围进行过滤。我在大纲中提出的问题:是否可以按键对数据帧进行排序,以便在随后运行更复杂的SQL查询之前进行有效的键范围过滤?

我知道使用PairRDDFunction可以对键值RDD(即Tuple2上的RDD)进行这种有效的过滤。我的工作流程目前看起来如下:

// Create a dataframe
val df: DataFrame = sqlContext.sql("SELECT * FROM ...")
val keyValRDD = df.rdd.map( (r: Row) => (r.getAs[String]("key"), r) )

// Sort by key - and cache.
val keyValRDDSorted = keyValRDD.sortByKey().cache

// Define a function to run SQL query on a range. 
def queryRange(lower: String, upper: String, sql: String, tableName: String) = {
    val rangeRDD = keyValRDDSorted.filterByRange(lower, upper)
    val rangeDF = sqlContext.createDataFrame(rangeRDD.map{ _._2 }, df.schema)
    rangeDF.createTempView(tableName)
    sqlContext.sql(sql)
}

// Invoke multiple times.
queryRange(...)
queryRange(...)
...

这样做很有效,因为只处理包含相关键范围的分区。但是,据我所知,与普通的RDD相比,Spark SQL使用优化的存储格式。上面的工作流程无法利用这一点,因为它是缓存的键值RDD。

所以,我的具体问题:是否有更有效的方法来达到预期效果?

任何指针都会非常感激。

0 个答案:

没有答案