迭代地更改列类型Spark数据帧

时间:2016-01-28 07:10:22

标签: apache-spark dataframe apache-spark-sql

我在Scala中有一个列名列表,如

var cols = List("col1", "col2", "col3","col4")

此外,我有一个包含这些列的数据框,但都是字符串。现在我想通过迭代数据框的列表或列来投射数据框的列,因为我的列列表非常大,我不能使用这么多.withColumn个参数

先谢谢

2 个答案:

答案 0 :(得分:4)

如果您事先知道输出类型,那么只需使用类似于此

的列映射列
val df = sc.parallelize(Seq(
  ("foo", "1.0", "2", "true"),
  ("bar", "-1.0", "5", "false")
)).toDF("v", "x", "y", "z")

val types = Seq(
  ("v", "string"), ("x", "double"), ("y", "bigint"), ("z", "boolean")
)

df.select(types.map{case (c, t) => col(c).cast(t)}: _*)

如果您不知道类型问题更棘手。虽然可以创建可以处理模式推断的自定义解析器,但是修改上游管道可能更有意义。忽略数据类型时使用Avro有什么意义。

答案 1 :(得分:0)

如果要在不指定单个列名的情况下将特定类型的多个列更改为另一个。我已经在https://stackoverflow.com/a/60552157/3351492

这里发布了答案