簡體   English   中英

Spark如何在java中通過數據集調用UDF

[英]Spark How to call UDF over dataset in java

Java 中以下 Scala 代碼片段的確切翻譯是什么?

import org.apache.spark.sql.functions.udf 
def upper(s:String) : String ={
    s.toUpperCase
}
val toUpper = udf(upper _)
peopleDS.select(peopleDS(“name”),toUpper(peopledS(“name”))).show

請填寫下面缺少的語句java eg

import org.apache.spark.sql.api.java.UDF1;
UDF1 toUpper= new UDF1<String, String>() {
            public String call(final String str) throws Exception {
                return str.toUpperCase();  }};

peopleDS.select(peopleDS.col("name"), /*how to run  toUpper("name"))?????*/.show();

注意:注冊 udf 然后使用 selectExpr 調用對我有用,但我需要上面顯示的類似內容。

工作示例:

sqlContext.udf().register("toUpper",(String s)->s.toUpperCase(), DataTypes.StringType);
 peopleDF.selectExpr("toUpper(name)","name").show();

在java中調用UDF而不注冊是不可能的。 請檢查在未注冊的情況下在 Java 中使用 UDF 下面是您的 UDF。

private static UDF1 toUpper = new UDF1<String, String>() {
    public String call(final String str) throws Exception {
        return str.toUpperCase();
    }
};

注冊 UDF,您就可以使用callUDF函數了。

import static org.apache.spark.sql.functions.callUDF;
import static org.apache.spark.sql.functions.col;

sqlContext.udf().register("toUpper", toUpper, DataTypes.StringType);
peopleDF.select(col("name"),callUDF("toUpper", col("name"))).show();
Input csv:

+-------+--------+------+
|   name| address|salary|
+-------+--------+------+
|   Arun|  Indore|     1|
|Shubham|  Indore|     2|
| Mukesh|Hariyana|     3|
|   Arun|  Bhopal|     4|
|Shubham|Jabalpur|     5|
| Mukesh|  Rohtak|     6|
+-------+--------+------+

import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.functions;
import org.apache.spark.sql.api.java.UDF1;
import org.apache.spark.sql.types.DataTypes;

public static void main(String[] args) {
        SparkConf sparkConf = new SparkConf().setAppName("test").setMaster("local");
        SparkSession sparkSession = new SparkSession(new SparkContext(sparkConf));

        Dataset<Row> dataset = sparkSession.read().option("header", "true")
                .csv("C:\\Users\\Desktop\\Spark\\user.csv");

        /**Create udf*/
        UDF1<String, String> toLower = new UDF1<String, String>() {
            @Override
            public String call(String str) throws Exception {
                return str.toLowerCase();
            }
        };

        /**Register udf*/
        sparkSession.udf().register("toLower", toLower, DataTypes.StringType);

        /**call udf using functions.callUDF method*/
        dataset.select(dataset.col("name"),dataset.col("salary"), 
        functions.callUDF("toLower",dataset.col("address")).alias("address")).show();

}

Output :
+-------+------+--------+
|   name|salary| address|
+-------+------+--------+
|   Arun|     1|  indore|
|Shubham|     2|  indore|
| Mukesh|     3|hariyana|
|   Arun|     4|  bhopal|
|Shubham|     5|jabalpur|
| Mukesh|     6|  rohtak|
+-------+------+--------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM