我想更改資料框中列的順序,并發現正確的方法如下:
val reorderedColumnNames: Array[String] = ??? // the new order of columns
val result: DataFrame = dataFrame.select(reorderedColumnNames.head, reorderedColumnNames.tail: _*)
我的問題是:如果冒號“:_*”應該為您提供集合的所有元素(Seq、List 或 Array),為什么不能像下面那樣完成?
val result: DataFrame = dataFrame.select(reorderedColumnNames: _*)
我不明白為什么 Spark 不接受第二種方式(并產生錯誤),因為這兩種方式都應該是等效的
uj5u.com熱心網友回復:
Dataset物件的 API要求它是這樣的。
首先,Dataframe是(從我記得的 2.0 開始,或多或少)只是Dataset[Row]在實作方面,因此您必須檢查Dataset的API 檔案。
查看該select方法,有兩種實作可供選擇。
def select(col: String, cols: String*): DataFrame
這個接受單個String,后跟任意數量的String。
def select(cols: Column*): DataFrame
這個接受任意數量的Column實體。
您的示例代碼:val reorderedColumnNames: Array[String]是一個字串陣列。因此,您只能使用該方法的字串變體,這需要使用至少一個String引數,后面可能還有其他引數。這就是為什么你不能直接擴展你的陣列。
如果您要將您的轉換Array[String]為 an Array[Column],它將起作用,即:
val reorderedColumnNamesAsCols: Array[Column] = reorderedColumnNames.map(col(_))
dataFrame.select(reorderedColumnNamesAsCols: _*)
現在為什么不也提出一個select(cols: String*)變體呢?我不知道是否/為什么提出這個建議,但我猜它不會被編譯器很好地發揮作用。我們可以檢查:
scala> class Test {
| def test(strs: String*): Unit = {}
| def test(nbrs: Integer*): Unit = {}
| }
<console>:13: error: double definition:
def test(strs: String*): Unit at line 12 and
def test(nbrs: Integer*): Unit at line 13
have same type after erasure: (strs: Seq)Unit
def test(nbrs: Integer*): Unit = {}
^
編譯器不高興。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/336042.html
