我有下表:
DEST_COUNTRY_NAME ORIGIN_COUNTRY_NAME count
United States Romania 15
United States Croatia 1
United States Ireland 344
Egypt United States 15
该表表示为Dataset
。
scala> dataDS
res187: org.apache.spark.sql.Dataset[FlightData] = [DEST_COUNTRY_NAME: string, ORIGIN_COUNTRY_NAME: string ... 1 more field]
以下基于count
列对数据集进行排序的查询有效。我得到count
列,对其进行排序并显示结果:
scala> dataDS.sort($"count".desc).show;
但是,如果我尝试使用select
,则它不起作用。为什么?
scala> dataDS.select(dataDS.col("count").desc).show()
我得到了错误:
java.lang.UnsupportedOperationException: Cannot evaluate expression: input[0, int, true] DESC NULLS LAST
我对此有几个疑问:
sort
的用途是什么,因为在我看来,排序是由col("..").desc
完成的? sort
只是将Column
数据类型转换为Dataset
吗?select
起作用?我的逻辑是(a)创建列dataDS.col("count").desc
的降序,(b)select
和(c)show
。我期望它能工作的原因是因为类似的sql查询将工作mysql> select count from flight_data_2015 ORDER BY count DESC;
答案 0 :(得分:2)
我希望它能够工作的原因是因为类似的sql查询将可以工作
mysql> select count from flight_data_2015 ORDER BY count DESC;
但是不一样。
select(dataDS.col("count").desc)
就像SELECT count DESC FROM dataDS
。请注意,没有ORDER BY
子句。
这就是SparkSQL中的.orderBy
或.sort
所做的,即dataDS.sort($"count".desc).show;
将是SELECT * FROM dataDS ORDER BY count DESC
。
此外,请注意,您可以按原样编写dataDS.sql("SELECT ... ")
(在注册临时视图之后),并且其性能与其他方法相同。
Dataset.sort
在该数据集中获取Column
个对象的列表,但它没有转换它们,仅返回一个新排序的Dataset