Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Apache spark Spark 2.1-支持callUDF中的字符串参数_Apache Spark_Apache Spark Sql_Apache Spark Dataset - Fatal编程技术网

Apache spark Spark 2.1-支持callUDF中的字符串参数

Apache spark Spark 2.1-支持callUDF中的字符串参数,apache-spark,apache-spark-sql,apache-spark-dataset,Apache Spark,Apache Spark Sql,Apache Spark Dataset,我有一个接受字符串参数和字段的UDF,但“callUDF”似乎只能接受字段。 我发现了一个使用selectExpr(…)或spark.sql(…)的解决方法,但我想知道是否有更好的方法 以下是一个例子: Schema-id,映射[String,String] spark.sqlContext.udf.register("get_from_map", (map: Map[String, String], att: String) => map.getOrElse(att, "")) val

我有一个接受字符串参数和字段的UDF,但“callUDF”似乎只能接受字段。 我发现了一个使用selectExpr(…)或spark.sql(…)的解决方法,但我想知道是否有更好的方法

以下是一个例子: Schema-id,映射[String,String]

spark.sqlContext.udf.register("get_from_map", (map: Map[String, String], att: String) => map.getOrElse(att, ""))

val data = spark.read...
data.selectExpr("id", "get_from_map(map, 'attr')").show(15)
这会奏效,但我希望有更好的方法,比如:

data.select($"id", callUDF("get_from_map", $"map", "attr"))
有什么想法吗?我错过什么了吗? 我还没有看到任何JIRA关于这方面的公开票,所以要么我错过了什么,要么我错过了使用


谢谢

您可以使用
lit
功能进行此操作

data.select($"id", callUDF("get_from_map", $"map", lit("attr")))

您可以使用
lit
功能进行此操作

data.select($"id", callUDF("get_from_map", $"map", lit("attr")))
实际上,使用lit()可以在需要列的地方传递文本(字符串、数字)。 您可能还希望使用udf函数注册您的函数,这样您就可以直接使用它,而不是调用callUDF:

import org.apache.spark.sql.functions._
val getFromMap = udf((map:Map[String,String], att : String) => map.getOrElse(att,""))
data.select($"id", getFromMap($"map", lit("attr")))
实际上,使用lit()可以在需要列的地方传递文本(字符串、数字)。 您可能还希望使用udf函数注册您的函数,这样您就可以直接使用它,而不是调用callUDF:

import org.apache.spark.sql.functions._
val getFromMap = udf((map:Map[String,String], att : String) => map.getOrElse(att,""))
data.select($"id", getFromMap($"map", lit("attr")))