我有一个动态创建的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时,它具有旧的模式,而不是更新的模式。
任何建议都会有所帮助。
谢谢
答案 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