dhe*_*eee 3 window-functions apache-spark apache-spark-sql
我试图在Spark数据帧中使用rowNumber.我的查询在Spark shell中按预期工作.但是当我在eclipse中编写它们并编译一个jar时,我面临一个错误
16/03/23 05:52:43 ERROR ApplicationMaster: User class threw exception:org.apache.spark.sql.AnalysisException: Could not resolve window function 'row_number'. Note that, using window functions currently requires a HiveContext;
org.apache.spark.sql.AnalysisException: Could not resolve window function 'row_number'. Note that, using window functions currently requires a HiveContext;
Run Code Online (Sandbox Code Playgroud)
我的疑问
import org.apache.spark.sql.functions.{rowNumber, max, broadcast}
import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy($"id").orderBy($"value".desc)
val dfTop = df.withColumn("rn", rowNumber.over(w)).where($"rn" <= 3).drop("rn")
Run Code Online (Sandbox Code Playgroud)
我在Spark shell中运行查询时没有使用HiveContext.不知道为什么当我运行jar文件时它返回错误.如果有帮助的话,我也在Spark 1.6.0上运行脚本.有没有人面临类似的问题?
我之前已经回答了类似的问题.错误消息显示全部.使用spark <version 2.x,你需要一个HiveContext在你的应用程序jar中,没有别的办法.
您可以在此处进一步了解SQLContextand HiveContext之间的区别.
SparkSQL有一个SQLContext和一个HiveContext.HiveContext是一套超级套装SQLContext.Spark社区建议使用HiveContext.您可以看到,当您运行spark-shell(您的交互式驱动程序应用程序)时,它会自动创建SparkContext定义为sc和HiveContext定义为sqlContext.将HiveContext允许你执行SQL查询以及蜂巢命令.
您可以尝试检查您的内部spark-shell:
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 1.6.0
/_/
Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_74)
scala> sqlContext.isInstanceOf[org.apache.spark.sql.hive.HiveContext]
res0: Boolean = true
scala> sqlContext.isInstanceOf[org.apache.spark.sql.SQLContext]
res1: Boolean = true
scala> sqlContext.getClass.getName
res2: String = org.apache.spark.sql.hive.HiveContext
Run Code Online (Sandbox Code Playgroud)
通过继承,HiveContext实际上是一个SQLContext,但反过来却不是这样.如果您更了解如何从中继承,则可以检查源代码.HiveContextSQLContext
从spark 2.0开始,您只需要创建一个SparkSession(作为单个入口点)来消除HiveContext/ SQLContext混淆问题.
| 归档时间: |
|
| 查看次数: |
8088 次 |
| 最近记录: |