具有有序密钥的sparksqlDataframe的高效过滤

1aaf6o9v  于 2021-05-27  发布在  Spark
关注(0)|答案(0)|浏览(260)

我得到了一个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。
那么,我的具体问题是:有没有更有效的方法来实现预期的结果?
任何指点都将不胜感激。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题