Spark Dataset排序并仅选指定列的无新数据集优化实现问询
更简洁的Spark Dataset排序+列选取写法
当然有更优雅的方式!你完全不需要拆分两步或者创建中间Dataset——Spark的Dataset操作支持链式调用,就像你熟悉的单条SQL语句一样,把排序和列选取操作串在一起就行,而且底层会合并成一个高效的执行计划,不会产生额外的中间数据结构。
方法1:链式调用sort和select
直接把两个操作连起来写,代码更简洁,逻辑也更清晰:
dataDS.sort(col("count").desc).select(col("count")).show()
如果你觉得col()有点繁琐,还可以直接用字符串表达式简化:
dataDS.sort("count desc").select("count").show()
方法2:用selectExpr贴近SQL写法
如果你更习惯SQL的语法顺序,也可以先选列再排序:
dataDS.selectExpr("count").orderBy("count desc").show()
这里orderBy和sort是等价的,只是命名更贴近SQL里的ORDER BY。
方法3:直接执行SQL语句(可选)
如果你完全想沿用SQL的写法,只需要把Dataset注册成临时视图,然后用Spark SQL执行即可:
dataDS.createOrReplaceTempView("flight_data") spark.sql("SELECT count FROM flight_data ORDER BY count DESC").show()
为什么这些方法更优?
Spark的Dataset操作是惰性求值的,链式调用的时候只是在构建执行计划,并不会生成多个中间Dataset。最终Spark会把这些操作合并优化,和你写的单条SQL查询的执行效率完全一致,既满足了简洁性,又保证了性能。
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

