2016-03-23 19 views
2

Spark veri çerçevelerinde rowNumber kullanmaya çalışıyorum. Sorgularım, Spark kabuğunda beklendiği gibi çalışıyor. i Tutulma bunları yazmak ve bir kavanoz derlemek Ama ne zaman, bir hata kıvılcım kabuğunda sorguları çalıştırırken ben HiveContext kullanmıyorumSpark içinde pencereleme işlevlerini kullanma

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; 

Benim sorguları

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") 

karşı karşıyayım. Bir jar dosyasıyla aynı işlemi çalıştırdığımda neden bir hata döndürdüğünden emin değilim. Ve ayrıca yardımcı olur eğer Spark 1.6.0 komut dosyaları çalıştırıyor. Herkes benzer bir sorunla karşılaştı mı?

cevap

4

Daha önce bir similar question yanıtını verdim. Hata mesajı tüm diyor. Uygulama grubunuzda bir HiveContext'e ihtiyacınız var, başka bir yol yok

SQLContextand HiveContext here arasındaki fark hakkında daha fazla bilgi edinebilirsiniz.

SparkSQL'in bir SQLContext ve bir HiveContext vardır. HiveContext, SQLContext'in süper kümesidir. Spark topluluğu HiveContext'i kullanmayı öneriyor. Etkileşimli sürücü uygulamanız olan kıvılcım kabuğunu çalıştırdığınızda, otomatik olarak sc olarak tanımlanan bir SparkContext ve sqlContext olarak tanımlanan bir HiveContext yarattığını görebilirsiniz. HiveContext, SQL sorgularını ve Hive komutlarını çalıştırmanıza izin verir.

listenize spark-shell o içini kontrol etmek deneyebilirsiniz:

miras olarak
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 

, HiveContext aslında bir SQLContext, ama tersi doğru değil., HiveContext'un SQLContext'dan itibaren nasıl olduğunu bilmek için daha fazla iç içe olup olmadığınızı kontrol edebilirsiniz.

+0

Detaylı açıklama için teşekkür ederiz. Bu benim sorunumu çözdü. – dheee

+0

Rica ederim! – eliasah

1

Spark 2.0 için, tek giriş noktası olarak SparkSession kullanılması önerilir. HiveContext/SqlContext karışıklık sorununu ortadan kaldırır. Nasıl Kullanılacağını öğrenmek için bu databricks article'a bakın.

+0

Bağımlılıklarınızda hala Kovana ihtiyacınız var mı? – sam

+0

'SparkSession', Spark 2.0'da yer almaktadır. Kullandığım şeyler için, Hive gerekli bir bağımlılık değildi. Yapmayı planladığınıza göre bu farklı olabilir, kesin olarak söyleyemem. –

İlgili konular