Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala dataframe在withColumn内部调用函数?_Scala_Apache Spark - Fatal编程技术网

Scala dataframe在withColumn内部调用函数?

Scala dataframe在withColumn内部调用函数?,scala,apache-spark,Scala,Apache Spark,这就是我要做的,我有两个表,它们的列名完全相同 表看起来有点像这样: ----------- A B C D ----------- 1 2 3 4 5 6 3 4 7 8 3 4 我需要解决的问题的逻辑是,比较表1和表2中的A B C D列。如果A、B彼此匹配,则返回值为0的新列,否则返回0。如果表A中的C是3,则返回0,否则返回1。每行只应返回一个值,优先级:C>D>A=B 我连接了两个表(数据帧),结果得到了一个combinedDf。这就是我加入他们的方式:Ta

这就是我要做的,我有两个表,它们的列名完全相同

表看起来有点像这样:

-----------
A  B  C  D 
-----------
1  2  3  4
5  6  3  4
7  8  3  4
我需要解决的问题的逻辑是,比较表1和表2中的A B C D列。如果A、B彼此匹配,则返回值为0的新列,否则返回0。如果表A中的C是3,则返回0,否则返回1。每行只应返回一个值,优先级:C>D>A=B

我连接了两个表(数据帧),结果得到了一个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"}
对于这个函数,我想将表1中的A,B列放入一个数组中,将表2中的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")))
但它就是不起作用,即使我使用数组函数将列放在数组中,它仍然告诉我类型不匹配

错误消息:
:错误:类型不匹配;找到:org.apache.spark.Column必需:String

提前谢谢

您可以尝试一下,但是可以帮助我理解一件事,为什么需要组合数据帧,以及如果A和B匹配(我的假设是每行,对吗?),如果A、B、C、D列是字符串,那么将整数更改为字符串

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

就像我说的,我需要数组类型,因为在实际情况中,我会有随机数目的列,所以我不能在我的udf中定义50个参数。Join是因为udf不能处理两个数据帧,无论我给udf的数据是什么,它都必须来自同一个数据帧,然后你可以使用concat_ws(“,”,Seq(col(“table1.A”),col(“table1.B”))作为第一个参数和类似的第二个参数(,)若要获取数组,则代码应该可以正常工作。通过这种方式,您可以组合动态列数值并作为一个字符串传递,然后在您的udf中解析它,获取数组并执行逻辑。希望有帮助。仍然键入错误,它说:Seq[org.apache.spark.sql.column]必填项:org.apache.spark.sql.column您能否发送错误消息的第一部分?您是如何连接这两个数据帧的?请也更新该部分。@Ramesh Maharjan更新连接是否有效?我想这不是因为您的连接语句完全错误。根据连接,两个数据帧的A列似乎与连接p匹配真的吗?