为什么我不能在select表中获得排序结果?

时间:2019-02-08 06:29:18

标签: apache-spark apache-spark-sql

我有下表:

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

我对此有几个疑问:

  1. sort的用途是什么,因为在我看来,排序是由col("..").desc完成的? sort只是将Column数据类型转换为Dataset吗?
  2. 为什么不使用select起作用?我的逻辑是(a)创建列dataDS.col("count").desc的降序,(b)select和(c)show。我期望它能工作的原因是因为类似的sql查询将工作mysql> select count from flight_data_2015 ORDER BY count DESC;

1 个答案:

答案 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