我能够在 Spark SQL“文字”查询中使用序号(这些在 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 中类似的东西吗?
最佳答案
// WON'T COMPILE
这里的两个上下文之间存在区别 - Scala 编译器和 Spark(运行时)。
在 Spark 中执行任何操作之前,它必须通过 Scala 编译器(假设您的编程语言是 Scala)。这就是为什么人们使用 Scala 来拥有这个额外的安全网(听说过“一旦 Scala 应用程序编译良好,它也应该可以正常工作”?)
编译 Spark 应用程序时,Scala 编译器将确保 groupBy
的签名可用,以便 groupBy(1)
在运行时正确。由于没有可用的groupBy(n: Int)
,因此编译失败。
如果有从 Int
到 Column
类型的隐式转换,它可能会工作得很好(但那会更疯狂)。
如果您使用 Scala,您可以创建可以共享的值(value),因此无需提供此类功能。
一个非常相似的问题是 Spark SQL 是否支持像 SQL 中那样作为序数的列,例如
df.select($"ProfileName").groupBy($"1").count().orderBy($"2".desc)
我不知道答案(而且我也不会欣赏这样的功能,因为它有点神秘)。
关于apache-spark - 如何使用 Dataset API 使用序数(例如 SQL 的 'GROUP BY 1' 或 'ORDER BY 2' )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45182023/