覆盖Spark数据框架模式



根据这篇文章,似乎Spark不能编辑和RDD或列。必须创建一个新的类型,并删除旧的类型。下面建议的for循环和. withcolumn方法似乎是完成这项工作的最简单方法。

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

我尝试手动定义模式,然后使用此模式从parquet文件加载数据并将其保存到另一个文件,但我得到"Job aborted"…每次在每个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|
+---+---+

相关内容

  • 没有找到相关文章

最新更新