簡體   English   中英

覆蓋Spark數據框架構

[英]Overwrite Spark dataframe schema

稍后編輯:根據本文 ,Spark似乎無法編輯RDD或列。 必須使用新類型創建新的,並刪除舊的。 下面建議的for循環和.withColumn方法似乎是完成工作的最簡單方法。

原始問題:是否有一種簡單的方法(對人和機器而言)都可以將多列轉換為不同的數據類型?

我嘗試手動定義架構,然后使用該架構從鑲木地板文件中加載數據並將其保存到另一個文件,但是每次每次在DF上都會出現“作業中止。” ...“寫入行時任務失敗”。 對我來說有點容易,對Spark來說很費力...並且它不起作用。

另一種選擇是使用:

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

對我來說,還有更多工作要做,因為有近100列,而且,如果Spark必須復制內存中的每一列,那么聽起來也不是最佳選擇。 有更容易的方法嗎?

根據轉換規則的復雜程度,您可以使用此循環來完成您要的內容:

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|
+---+---+

這應該與任何其他列操作一樣有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM