【发布时间】:2017-05-09 04:57:12
【问题描述】:
我试图比较两个不同列中的整数包装数组并将评级作为字符串:
import org.apache.spark.sql.Row
import org.apache.spark.sql.functions._
import scala.collection.mutable.WrappedArray
DataFrame 数据的 A 列和 B 列带有我想比较的包装数组:
val data = Seq(
(Seq(1,2,3),Seq(4,5,6),Seq(7,8,9)),
(Seq(1,1,3),Seq(6,5,7),Seq(11,9,8))
).toDF("A","B","C")
下面是它的样子:
data: org.apache.spark.sql.DataFrame = [A: array<int>, B: array<int> ... 1 more field]
+---------+---------+----------+
| A| B| C|
+---------+---------+----------+
|[1, 2, 3]|[4, 5, 6]| [7, 8, 9]|
|[1, 1, 3]|[6, 5, 7]|[11, 9, 8]|
+---------+---------+----------+
然后这里是用户定义函数,我想比较每行 A 列和 B 列中配对数组中的每个元素,并用简单的逻辑给出评级。例如,如果 A(1) > B(1),则 D(1) 为“顶部”。所以作为D列的第一行,我希望有[“Top”,“Top”,“Top”]
def myToChar(num1: Seq[Int], num2: Seq[Int]): Seq[String] = {
val twozipped = num1.zip(num2)
for ((x,y) <- num1.zip(num2)) {
if (x > y) "Top"
if (x < y) "Well"
if (x == y) "Good"
}}
val udfToChar = udf(myToChar(_: Seq[Int], _: Seq[Int]))
val ouput = data.withColumn("D",udfToChar($"A",$"B"))
但是,我不断收到<console>:45: error: type mismatch; 错误信息。不确定我的 udf() 类型定义是否错误,感谢任何指导以纠正我的错误。
【问题讨论】:
标签: arrays scala apache-spark udf