2016-01-22 10 views
27

से एकाधिक कॉलम चुनने के लिए सूची को अपनाने के लिए मेरे पास स्पार्क डेटा फ्रेम df है। क्या इन स्तंभों की सूची का उपयोग करके कुछ कॉलम का चयन करने का कोई तरीका है?स्पार्क डेटा फ्रेम

scala> df.columns 
res0: Array[String] = Array("a", "b", "c", "d") 

मुझे पता है कि मैं df.select("b", "c") जैसे कुछ कर सकता हूं। लेकिन मान लीजिए मेरे पास कुछ कॉलम नाम val cols = List("b", "c") वाली एक सूची है, क्या इसे df.select में पास करने का कोई तरीका है? df.select(cols) एक त्रुटि फेंकता है। अजगर के रूप df.select(*cols) की तरह कुछ

उत्तर

48

उपयोग df.select(cols.head, cols.tail: _*)

मुझे पता है अगर यह काम करता है :)

Explanation from @Ben करते हैं:

select(col: String, cols: String*) 

:

कुंजी का चयन करने की विधि हस्ताक्षर है cols:String* प्रविष्टि तर्कों की एक चर संख्या लेता है। :_* तर्कों को अनपैक करता है ताकि उन्हें इस तर्क से संभाला जा सके। *args के साथ अजगर में अनपॅकिंग के समान ही। अन्य उदाहरणों के लिए here और here देखें।

+1

धन्यवाद! एक जादू की तरह काम किया। वाक्यविन्यास के बारे में थोड़ा और समझा सकता है? विशेष रूप से 'col.tail: _ * 'क्या करता है? – Ben

+8

मुझे लगता है कि अब मैं समझता हूं। कुंजी चुनिंदा 'चयन (कॉल: स्ट्रिंग, कोल्स: स्ट्रिंग *)' का विधि हस्ताक्षर है। 'Cols: स्ट्रिंग *' प्रविष्टि तर्कों की एक चर संख्या लेता है। ': _ *' तर्कों को अनपैक करता है ताकि उन्हें इस तर्क से संभाला जा सके। '* Args' के साथ अजगर में अनपॅकिंग के समान ही। [यहां] देखें (http://stackoverflow.com/a/1660768/4096199) और [यहां] (http://stackoverflow.com/questions/6051302/what-does-colon-underscore-star-do-in- स्कैला) अन्य उदाहरणों के लिए। – Ben

+0

कूल! आपको यह सही मिला :) क्षमा करें मुझे अभी दोनों सूचनाएं मिली हैं, इसलिए पहले जवाब नहीं दे सका। :) –

12

आप इस तरह स्तंभ चिंगारी स्ट्रिंग टाइपकास्ट कर सकते हैं:

import org.apache.spark.sql.functions._ 
df.select(cols.map(col): _*) 
8

एक अन्य विकल्प है कि मैं सिर्फ सीखा है।

import org.apache.spark.sql.functions.col 
val columns = Seq[String]("col1", "col2", "col3") 
val colNames = columns.map(name => col(name)) 
val df = df.select(colNames:_*) 
1

आप select के प्रकार Column* के तर्कों पारित कर सकते हैं:

val df = spark.read.json("example.json") 
val cols: List[String] = List("a", "b") 
//convert string to Column 
val col: List[Column] = cols.map(df(_)) 
df.select(col:_*) 
+0

थोड़ा छोटा संस्करण के बारे में क्या: 'df.select (cols.map (df (_)): _ *)'? – MaxU