apache spark - read - Uso de funciones de ventana en Spark
spark sql functions (2)
Para Spark 2.0, se recomienda utilizar SparkSession
como punto de entrada único. Elimina el problema de confusión de HiveContext
/ SqlContext
.
import org.apache.spark.sql.SparkSession
val session = SparkSession.builder
.master("local")
.appName("application name")
.getOrCreate()
Echa un vistazo a este artículo de datos sobre cómo usarlo.
Estoy tratando de usar rowNumber en marcos de datos Spark. Mis consultas funcionan como se esperaba en Spark shell. Pero cuando los escribo en eclipse y compilo un jar, me enfrento a un error
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;
Mis consultas
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")
No estoy usando HiveContext mientras ejecuto las consultas en spark shell. No estoy seguro de por qué está devolviendo un error cuando ejecuto lo mismo que un archivo jar. Y también estoy ejecutando las secuencias de comandos en Spark 1.6.0 si eso ayuda. ¿Alguien se enfrenta a un problema similar?
Ya he respondido una pregunta similar antes. El mensaje de error dice todo. Necesitarás un HiveContext en tu contenedor de aplicaciones, no hay otro camino
Puede leer más sobre la diferencia entre SQLContex y HiveContext aquí .
SparkSQL tiene un SQLContext y un HiveContext. HiveContext es un súper conjunto de SQLContext. La comunidad Spark sugiere usar HiveContext. Puede ver que cuando ejecuta spark-shell, que es su aplicación de controlador interactivo, crea automáticamente un SparkContext definido como sc y un HiveContext definido como sqlContext. HiveContext le permite ejecutar consultas SQL así como comandos de Hive.
Puedes intentar verificar que dentro de tu 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
Por herencia, HiveContext
es en realidad un SQLContext
, pero no es cierto al revés. Puede verificar el código fuente si está más HiveContext
en saber cómo hereda SQLContext
de SQLContext
.