2016-10-19 58 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'将是你最好的选择。 –