我得到了一个sparksqlDataframe,其中包含一个“key”列。我要运行的查询是从筛选关键字范围开始的。我在大纲中的问题是:在随后运行更复杂的sql查询之前,是否可以按键对dataframe排序,以便进行有效的键范围筛选?
我知道使用pairrdd函数对键值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。
那么,我的具体问题是:有没有更有效的方法来实现预期的结果?
任何指点都将不胜感激。
暂无答案!
目前还没有任何答案,快来回答吧!