2016-10-19 76 views
0

後編輯: 基於此article似乎Spark不能編輯和RDD或列。必須使用新類型創建一個新類型,並刪除舊類型。以下建議的for循環和.withColumn方法似乎是完成工作的最簡單方法。覆蓋Spark數據幀架構

原文出處: 有沒有簡單的方法(對於人和機器)將多列轉換爲不同的數據類型?

我試圖手動定義模式,然後使用此模式從實驗室文件加載數據並將其保存到另一個文件,但我得到「作業中止。」......每次寫入行時「任務失敗」在每個DF上。對我來說有點容易,對Spark很費力......並且它不起作用。

另一種選擇是使用:對我來說更

df = df.withColumn("new_col", df("old_col").cast(type)).drop("old_col").withColumnRenamed("new_col", "old_col") 

一點的工作,因爲有近100列,如果星火在內存複製每一列,那麼這聽起來既優化。有更容易的方法嗎?

回答

2

根據鑄造規則多麼複雜的,你可以完成你問一個與這個循環什麼:

scala> var df = Seq((1,2),(3,4)).toDF("a", "b") 
df: org.apache.spark.sql.DataFrame = [a: int, b: int] 

scala> df.show 
+---+---+ 
| a| b| 
+---+---+ 
| 1| 2| 
| 3| 4| 
+---+---+ 

scala> import org.apache.spark.sql.types._ 
import org.apache.spark.sql.types._ 

scala> > df.columns.foreach{c => df = df.withColumn(c, df(c).cast(DoubleType))} 

scala> df.show 
+---+---+ 
| a| b| 
+---+---+ 
|1.0|2.0| 
|3.0|4.0| 
+---+---+ 

這應該是任何其他列操作效率。

+1

列不是全部相同的類型,所以我仍然必須使用元組列表。儘管如此,出於某種原因,我並不認爲你可以用「withColumn」:)覆蓋一個列,所以非常感謝你,它可以避免丟棄和重命名部分。 – UrVal

+0

然後是的,我認爲'(名稱,類型)'對'foreach'將是你最好的選擇。 –