迭代更改列类型 Spark 数据帧
Change column types iteratively Spark data frames
我有一个 Scala 中的列名列表,例如
var cols = List("col1", "col2", "col3","col4")
我还有一个包含这些列的数据框,但都是字符串形式。现在我想通过遍历数据框的列表或列来转换数据框的列,因为我的列列表非常大,我无法承受使用这么多 .withColumn
个参数
提前致谢
如果您预先知道输出类型,只需使用类似于此的内容映射列即可
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 有什么意义。
如果您想将特定类型的多个列更改为另一种而不指定单独的列名。我已经在这里发布了我的答案
我有一个 Scala 中的列名列表,例如
var cols = List("col1", "col2", "col3","col4")
我还有一个包含这些列的数据框,但都是字符串形式。现在我想通过遍历数据框的列表或列来转换数据框的列,因为我的列列表非常大,我无法承受使用这么多 .withColumn
个参数
提前致谢
如果您预先知道输出类型,只需使用类似于此的内容映射列即可
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 有什么意义。
如果您想将特定类型的多个列更改为另一种而不指定单独的列名。我已经在这里发布了我的答案