scala数据帧调用函数里面有withColumn?

时间:2017-07-25 19:41:47

标签: scala apache-spark

这是我想要做的,我有两个表具有完全相同的列名。

表看起来有点像这样:

-----------
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 提前谢谢!

1 个答案:

答案 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")
             )
      )