apache-spark - 如何使用 Dataset API 使用序数(例如 SQL 的 'GROUP BY 1' 或 'ORDER BY 2' )?

标签 apache-spark dataframe apache-spark-sql

我能够在 Spark SQL“文字”查询中使用序号(这些在 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 中类似的东西吗?

最佳答案

// WON'T COMPILE

这里的两个上下文之间存在区别 - Scala 编译器和 Spark(运行时)。

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

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

如果有从 IntColumn 类型的隐式转换,它可能会工作得很好(但那会更疯狂)。

如果您使用 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/

相关文章:

python - 在 Pyspark-Cluster 模式下的工作节点上安装外部库

r - 将列表 append 到 R 中的数据框

java - Spark Java except 方法与 leftanti join 返回不一致的结果,可能是错误吗?

azure - 到 HDInsight Spark 的 Rest 接口(interface)以提交作业并读取结果

python - pandas 操作是否与 groupby 互补(相反)?

scala - UnresolvedException : Invalid call to dataType on unresolved object when using DataSet constructed from Seq. 空(自 Spark 2.3.0 起)

python-2.7 - Spark 2.3.0读取带有标题选项的文本文件不起作用

scala - Apache Spark : How to save the dataframe results (Dataframe with joins), 所以对数据帧的操作不会改变结果?

python - 如何将巨大的 Pandas 数据框保存到 hdfs?

python - 将 pandas DataFrame 列拆分为可变数量的列