这是我想要做的,我有两个表具有完全相同的列名。
表看起来有点像这样:
-----------
A B C D
-----------
1 2 3 4
5 6 3 4
7 8 3 4
我需要解决的问题的逻辑是,将Table1中的A B C D列与Table2进行比较。如果A,B彼此匹配,则返回值为0的新列,否则返回0.如果表A中的C为3,则返回0,否则返回1.每行只返回一个值,优先级:C> D> ; A = B
我加入了两个表(dataFrames),结果是一个combinedDf。这就是我加入他们的方式:Table1.join(Table2,table1($"A")=table2($"A"))
所以这就是我所做的:
def func(A:mutable.WrappedArray[String],B:mutable.WrappedArray[String],C:String,D:String) =
{if(C=="3") "0";
else if(D=="4")"1";
else if ((0 to A.length-1).exists(i => A(i) == B(i)))"0" else "1"}
对于这个函数,我想将Table1中的A,B列放入一个数组,将Table2中的A,B列放入另一个数组,并运行for循环来检查相等性。 (我需要数组,因为在实际情况下,我需要比较随机数量的列。)
以下是我如何调用该函数。
combinedDf.withColumn("returnVal",func(array(col("table1.A"),col("table1.B")),
array(col("table2.A"),col("table2.B")),col("table1.C"),col("table1.D")))
但它只是不起作用,即使我使用数组函数将列放在数组中,它仍然告诉我类型不匹配。
错误讯息:<console:67>: error: type mismatch; found:org.apache.spark.Column required: String
提前谢谢!
答案 0 :(得分:0)
你可以尝试这个,但是帮助我理解一件事为什么你需要结合数据框,你的意思是如果A和B匹配(我的假设是每行,我是对的吗?),如果你的A, B,C,D列是字符串然后将整数更改为String。
def func(A:Integer,B:Integer,C:Integer,D:Integer) =
{
if(C == 3) "0"
else if(D == 4) "1"
else if (A == B) "0"
else "1"
}
val udfFunc = udf(func _)
combinedDf.withColumn("returnVal",
udfFunc(col("table1.A"), col("table1.B"),
col("table1.C"),col("table1.D")
)
)