0

我有一个包含“键”列的 Spark SQL 数据框。我要运行的查询从过滤键范围开始。我的问题概述:在随后运行更复杂的 SQL 查询之前,是否可以通过键对数据帧进行排序以便进行有效的键范围过滤器?

我知道使用 PairRDDFunctions 可以对键值 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(...)
...

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

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

任何指针将不胜感激。

4

0 回答 0