如何使用数据集API(如SQL的'GROUP BY 1'或'ORDER BY 2')使用序数?

时间:2017-07-19 05:57:41

标签: apache-spark dataframe apache-spark-sql

我能够在Spark SQL'literal'查询中使用序数(GROUP BYORDER BY之后的这些整数):

sqlContext.sql("SELECT ProfileName, COUNT(1) FROM df GROUP BY 1 ORDER BY 2 DESC")

但是对于DataFrames / DataSets,我必须始终使用列名:

df.select($"ProfileName").groupBy($"ProfileName").count().orderBy(desc("count"))

我没有找到在DataFrame中使用序数的方法。

我正在寻找的是:

df.select($"ProfileName").groupBy(1).count().orderBy(desc(2)) // WON'T COMPILE

我可以使用Spark SQL中的那些东西吗?

2 个答案:

答案 0 :(得分:1)

数据框中的列无法通过索引访问,但如果您需要按索引访问,则可以执行以下操作

df.select($"ProfileName").groupBy(df1.columns(1)).count()
  .orderBy(desc(df1.columns(1))) 

注意:索引从0开始

希望这有帮助!

答案 1 :(得分:1)

  

//不会编译

这里有两个上下文区别 - Scala编译器和Spark(运行时)。

在Spark中执行任何操作之前,必须通过Scala编译器(假设您的编程语言是Scala)。这就是为什么人们使用Scala来获得这个额外的安全网(听说“一旦Scala应用程序编译得很好,它应该可以正常工作”?)

编译Spark应用程序时,Scala编译器将确保groupBy的签名可用,因此groupBy(1)在运行时是正确的。由于没有groupBy(n: Int)可用,编译失败。

如果存在从IntColumn类型的隐式转换(但这甚至可能是 Crazier ),它本可以正常工作。

鉴于您使用Scala,您可以创建可以共享的值,因此无需提供此类功能。

一个非常类似的问题是Spark SQL是否支持像SQL那样的序列,例如

df.select($"ProfileName").groupBy($"1").count().orderBy($"2".desc)

我不知道答案(我也不会理解这个功能,因为它有点神秘)。