在Spark数据帧中使用forloop添加新列

时间:2019-05-19 06:01:48

标签: apache-spark apache-spark-sql

我有一个动态创建的spark数据框。还有一些列需要从该数据框中选择。

我需要遍历所需列的列表,并检查数据框中是否存在这些列。如果找到,则需要重命名dataframe列,否则,请重命名,否则,请创建新列,并将其放置为“ null”值。

我尝试过使用forloop,然后使用以下条件:

我的数据框具有列:a.col1,a.col2,a.col3,a.col4,b.col2

public class MyParquetWriter  extends ParquetWriter{

    MyParquetWriter(OutputFile file, Mode mode, WriteSupport writeSupport, CompressionCodecName compressionCodecName,
            int rowGroupSize, boolean validating, Configuration conf, int maxPaddingSize,
            ParquetProperties encodingProps) throws IOException {
        super(file, mode, writeSupport, compressionCodecName, rowGroupSize, validating, conf, maxPaddingSize, encodingProps);

    }
}

我需要在循环后使用此数据框进行进一步的操作。

也尝试使用带有yield的for循环,但是它给了我一系列数据帧。

如何在forloop和if条件中更新此数据框。 因为当我尝试在forloop之外使用printSchema时,它具有旧的模式,而不是更新的模式。

任何建议都会有所帮助。

谢谢

1 个答案:

答案 0 :(得分:0)

该API是不可变的,因此withColumn不会更改现有值df,而是返回一个新值。例如

val newDf = cols_needed.foldLeft(df) {
  case (tmpdf, c) =>
    if (Try(df(c)).isFailure) {
      tmpdf.withColumn(c, lit(null))
    } else {
      tmpdf.withColumn(`c`, df(c))
    }
}
// now newDf contains the added columns