2016-02-10 42 views
1

我正在嘗試將一個參數列表傳遞給一個函數。Scala:擴展參數列表給出錯誤

scala> val a = Array("col1", "col2") 
a: Array[String] = Array(col1, col2) 

我試圖使用:_*符號,但它不工作。我不能爲我的生活工作,爲什麼!

val edges = all_edges.select(a:_*) 
<console>:27: error: overloaded method value select with alternatives: 
(col: String,cols: String*)org.apache.spark.sql.DataFrame <and> 
(cols: org.apache.spark.sql.Column*)org.apache.spark.sql.DataFrame 
cannot be applied to (String) 

然而,這沒有問題:如果 val edges = all_edges.select("col1", "col2")

不知道這是相關的,但all_edges是我試圖僅僅通過在列表中指定他們保持列的火花數據幀。

scala> all_edges 
res4: org.apache.spark.sql.DataFrame 

任何想法?我一直在努力從例如。 Passing elements of a List as parameters to a function with variable arguments但似乎並沒有太遠

編輯:剛剛找到How to "negative select" columns in spark's dataframe - 但我很困惑,爲什麼語法twocol.select(selectedCols.head, selectedCols.tail: _*)是必要的?

回答

9

如果你想傳遞一個字符串,該函數的簽名表明您必須通過至少一個:

(col: String,cols: String*)org.apache.spark.sql.DataFrame 

所以,你必須挑出列表的第一個參數:星星之火,可以不從單獨的類型Traversable確定它不是空的。

val edges = all_edges.select(a.head, a.tail: _*) 

現在,這是它的髒版本。如果要嚴格地做到這一點,你應該檢查列表不爲空自己:

val edges = a.headOption.map((fst) => all_edges.select(fst, a.drop(1)) 
+0

感謝 - 作爲一般的Scala的問題 - 如果函數簽名(COL:字符串的cols:字符串*),爲什麼只有字符串仍然有效(似乎沒有任何其他重載,例如'all_edges.select(「col1」)?' – undershock

+0

因爲空序列仍然是一個序列,因此它可以被「解釋」(適應)'all_edges.select(「col1」)''all_edges.select(「col1」,Seq():_ *)' – huitseeker