我有一个包含“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。
所以,我的具体问题:是否有更有效的方法来达到预期效果?
任何指针都会非常感激。