2016-01-28 41 views
2

我有列名的列表中阶状更改列类型反复火花数据帧

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

我也有在弦与这些列的数据帧,但所有。现在我想通过列表或数据框的列迭代投数据帧的列,因为我列的列表是非常大的,我买不起用这么多.withColumn参数

由于提前

+0

您是否尝试过[Schema Inference](http://spark.apache.org/docs/latest/sql-programming-guide.html#inferring-the-schema-using-reflection)? – eliasah

+0

我无法使用模式推理,因为我直接将avro文件读取为火花数据帧。 – nareshbabral

+0

@eliasah重复http://stackoverflow.com/q/34037889/1560062?还是它应该得到自己的答案? – zero323

回答

3

如果你知道的输出类型与此类似

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有什么意义。