我在scala中有两个数据帧,它们都有来自两个不同表但具有相同结构(srcdataframe
和tgttable
)的数据。我必须基于复合主键加入这两个,并选择几列并附加两列代码,如下所示:
for(i <- 2 until numCols) {
srcdataframe.as("A")
.join(tgttable.as("B"), $"A.INSTANCE_ID" === $"B.INSTANCE_ID" &&
$"A.CONTRACT_LINE_ID" === $"B.CONTRACT_LINE_ID", "inner")
.filter($"A." + srcColnm(i) =!= $"B." + srcColnm(i))
.select($"A.INSTANCE_ID",
$"A.CONTRACT_LINE_ID",
"$"+"\""+"A."+srcColnm(i)+"\""+","+"$"+"\""+"B."+srcColnm(i)+"\"")
.withColumn("MisMatchedCol",lit("\""+srcColnm(i)+"\""))
.withColumn("LastRunDate",current_timestamp.cast("long"))
.createOrReplaceTempView("IPF_1M_Mismatch");
hiveSQLContext.sql("Insert into table xxxx.f2f_Mismatch1 select t.* from (select * from IPF_1M_Mismatch) t");}
以下是我要做的事情:
答案 0 :(得分:1)
您可以简单地使用字符串或$
函数,而不是使用col()
创建列。我还建议在for之外执行join
,因为这是一项昂贵的操作。稍微改变了代码,解决问题的主要区别在于选择:
val df = srcdataframe.as("A")
.join(tgttable.as("B"), Seq("INSTANCE_ID", "CONTRACT_LINE_ID"), "inner")
for(columnName <- srcColnm) {
df.filter(col("A." + columnName) =!= col("B." + columnName))
.select("INSTANCE_ID", "CONTRACT_LINE_ID", "A." + columnName, "B." + columnName)
.withColumn("MisMatchedCol", lit(columnName))
.withColumn("LastRunDate", current_timestamp().cast("long"))
.createOrReplaceTempView("IPF_1M_Mismatch")
// Hive command
}
关于select
中的问题:
$
是col()
函数的缩写,它按名称在数据框中选择一列。 select
中的问题是,为了清楚起见,两个第一个参数col("A.INSTANCE_ID")
和col("A.CONTRACT_LINE_ID") are two columns (
$ replaced by
col()`。
但是,接下来的两个参数是字符串。不可能混合这两个,要么所有参数都应该是列,要么全部都是字符串。使用"A."+srcColnm(i)
构建列名$
时,无法使用,但您可以使用col("A."+srcColnm(i))
。