覆盖Spark数据帧架构

时间:2016-10-19 16:29:54

标签: scala apache-spark spark-dataframe

稍后编辑: 基于此article,似乎Spark无法编辑和RDD或列。必须使用新类型创建新类型并删除旧类型。下面提出的for循环和.withColumn方法似乎是完成工作的最简单方法。

原始问题: 是否有一种简单的方法(对于人类和机器)将多个列转换为不同的数据类型?

我尝试手动定义架构,然后使用此架构从镶木地板文件加载数据并将其保存到另一个文件但我得到了#34;作业已中止。" ..."任务写行时失败了#34;每次和每次DF。对我来说有点容易,对Spark很费力......而且它不起作用。

另一个选择是使用:

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

对我来说还有一点工作,因为有近100列,如果Spark必须复制内存中的每一列,那么这听起来也不是最优的。有更简单的方法吗?

1 个答案:

答案 0 :(得分: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|
+---+---+

这应该与任何其他列操作一样有效。