迭代地更改Spark数据框的列类型

3

我有一个Scala的列名列表,例如:

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

我有一个数据框,其中所有列都是字符串。现在我想通过迭代数据框的列列表或列来转换数据框的列,因为我的列列表非常大,我无法承受使用太多的 .withColumn 参数。
提前感谢。
2个回答

5
如果您事先知道输出类型,那么只需要类似于以下方式对列进行映射即可:
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的意义何在?

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接