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匹配真的吗?