我能够在Spark SQL'literal'查询中使用序数(GROUP BY
和ORDER 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中的那些东西吗?
答案 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)
可用,编译失败。
如果存在从Int
到Column
类型的隐式转换(但这甚至可能是 Crazier ),它本可以正常工作。
鉴于您使用Scala,您可以创建可以共享的值,因此无需提供此类功能。
一个非常类似的问题是Spark SQL是否支持像SQL那样的序列,例如
df.select($"ProfileName").groupBy($"1").count().orderBy($"2".desc)
我不知道答案(我也不会理解这个功能,因为它有点神秘)。