2016-07-25 6 views
8

मुझे एक विंडो फ़ंक्शन की आवश्यकता है जो कुछ कुंजियों (= कॉलम नाम) द्वारा विभाजन, किसी अन्य कॉलम नाम से ऑर्डर करता है और शीर्ष x रैंक वाली पंक्तियां देता है।स्पार्क विंडो कार्यों में अवरोही क्रम के साथ ऑर्डरबी() का उपयोग कैसे करें?

यह आरोही क्रम के लिए ठीक काम करता है:

def getTopX(df: DataFrame, top_x: String, top_key: String, top_value:String): DataFrame ={ 
    val top_keys: List[String] = top_key.split(", ").map(_.trim).toList 
    val w = Window.partitionBy(top_keys(1),top_keys.drop(1):_*) 
     .orderBy(top_value) 
    val rankCondition = "rn < "+top_x.toString 
    val dfTop = df.withColumn("rn",row_number().over(w)) 
     .where(rankCondition).drop("rn") 
    return dfTop 
} 

लेकिन जब मैं लाइन 4 में orderBy(desc(top_value)) या orderBy(top_value.desc) करने के लिए इसे बदलने की कोशिश, मैं एक वाक्य रचना त्रुटि मिलती है। यहां सही वाक्यविन्यास क्या है?

+0

क्या त्रुटि संदेश आपको मिलने वाला है मिल सकता है? –

उत्तर

16

orderBy के दो संस्करण हैं, जो तारों के साथ काम करता है और Column ऑब्जेक्ट्स (API) के साथ काम करता है। आपका कोड पहले संस्करण का उपयोग कर रहा है, जो सॉर्ट ऑर्डर बदलने की अनुमति नहीं देता है। आपको कॉलम संस्करण पर स्विच करने की आवश्यकता है और फिर desc विधि को कॉल करें, उदाहरण के लिए, myCol.desc

अब, हम एपीआई डिजाइन क्षेत्र में आते हैं। Column पैरामीटर पास करने का लाभ यह है कि आपके पास बहुत अधिक लचीलापन है, उदाहरण के लिए, आप अभिव्यक्तियों का उपयोग कर सकते हैं, आदि। यदि आप एक एपीआई बनाए रखना चाहते हैं जो Column के विपरीत स्ट्रिंग में लेता है, तो आपको स्ट्रिंग को एक में कनवर्ट करना होगा स्तंभ। ऐसा करने के कई तरीके हैं और org.apache.spark.sql.functions.col(myColName) का उपयोग करना सबसे आसान है।

यह सबको एक साथ रखें, हम

.orderBy(org.apache.spark.sql.functions.col(top_value).desc) 
+0

.orderBy (org.apache.spark.sql.functions.col (top_value) .desc()) – kecso

+0

स्कैला में कोष्ठक अनावश्यक हैं। – Sim

+0

ओह ... यकीन है कि मैंने घटना की जांच नहीं की है कि प्रश्न में कोड स्कैला है, और स्कैला टैग है :) इसके बारे में क्षमा करें – kecso

संबंधित मुद्दे