我有一个名为“A”的数据框,其中包含300多列,我正在尝试加入名为“A”的数据框,其增量数据“B”的模式与“A”相同。
加入数据框后,我得到了重复的列。我通过使用co
避免了val toPrint = udf((value1: String, value2: String) => if(value1 != null) {value1} else value2)
val dfClean = df1.join(df2, df1("PERIOD_TAG") === df2("PERIOD_TAG"), "fullouter").select(toPrint(df1("PERIOD_SHORT_DESCRIPTION"),df2("PERIOD_SHORT_DESCRIPTION")).alias("PERIOD_SHORT_DESCRIPTION"),toPrint(df1("PERIOD_TAG"),df2("PERIOD_TAG")).alias("PERIOD_TAG"))....so on for all the columns
我正在调用UDF来从重复列中选择最新值(来自增量文件)。 增量数据将包含很少的更新数据,我需要在增量数据帧中添加所有新数据以及数据帧“B”的旧数据。
还有其他方法可以避免单独选择列并使用for循环。 或者有没有办法在加入后,我得到我的增量df的新值/更新值和数据帧“B”的旧值,这些值在数据帧“A”中不存在。
答案 0 :(得分:0)
我首先使用join
运算符single-string usingColumn
argument来避免重复加入列名称。
df1.join(df2, "PERIOD_TAG", "fullouter")
负责重复PERIOD_TAG
列。
与其他连接函数不同,连接列只会在输出中出现一次,即类似于SQL的JOIN USING语法。
最后一步是使用合并功能:
合并(e:列*):列返回第一列不是
null
的列,如果所有输入都是null
,则返回null
。
这看起来完全符合你的情况,避免处理300多列。
val myCol = coalesce($"df1.one", $"df2.one") as "one"
df1.join(df2, "PERIOD_TAG", "inner").
select(myCol).
show
因此,练习是使用myCol
函数为模式中的每一列构建coalesce
- 类似列的序列(看起来就像一个相当简单的编程任务: ))