这是我的问题,我有一个地图Map[Array[String],String]
,我想将它传递给UDF。如何在火花中将地图传入UDF
这里是我的UDF:
def lookup(lookupMap:Map[Array[String],String]) =
udf((input:Array[String]) => lookupMap.lift(input))
这里是我的地图变量:
val srdd = df.rdd.map { row => (
Array(row.getString(1),row.getString(5),row.getString(8)).map(_.toString),
row.getString(7)
)}
这里是我如何调用该函数:
val combinedDF = dftemp.withColumn("a",lookup(lookupMap))(Array($"b",$"c","d"))
我第一次得到了一个错误关于不可变数组,所以我将数组更改为不可变类型,然后发生了有关类型不匹配的错误。我google了一下,显然我不能直接将非列类型传递给UDF。有人可以帮忙吗?荣誉。
更新:所以我所做的一切转换成包裹阵列。下面是我做的:
val srdd = df.rdd.map{row => (WrappedArray.make[String](Array(row.getString(1),row.getString(5),row.getString(8))),row.getString(7))}
val lookupMap = srdd.collectAsMap()
def lookup(lookupMap:Map[collection.mutable.WrappedArray[String],String]) = udf((input:collection.mutable.WrappedArray[String]) => lookupMap.lift(input))
val combinedDF = dftemp.withColumn("a",lookup(lookupMap))(Array($"b",$"c",$"d"))
现在我有这样的错误:
required: Map[scala.collection.mutable.WrappedArray[String],String] -ksh: Map[scala.collection.mutable.WrappedArray[String],String]: not found [No such file or directory]
我试图做这样的事情:
val m = collection.immutable.Map(1->"one",2->"Two")
val n = collection.mutable.Map(m.toSeq: _*)
但后来我刚回来到列类型的错误。
如何创建一个包裹数组?我做了val srdd = df.rdd.map {row =>(WrappedArray(row.getString(1),row.getString(5),row.getString(8)),row。getString(7))}但它告诉我包裹数组不参数 – Anna
您可以使用'mutable.WrappedArray.make [String](Array(...))' - 查看更新的答案 –
我收到另一个错误,错误:类型不匹配; found:scala.collection.Map [scala.collection.mutable.WrappedArray [String],String] required:scala.collection.immutable.Map [scala.collection.mutable.WrappedArray [String],String] 请参阅我的更新 – Anna