SparkSQL之自定義UDF

當(dāng)SparkSQL里內(nèi)置的函數(shù)無(wú)法滿足我們業(yè)務(wù)需求時(shí),我們可以通過(guò)自定義UDF來(lái)實(shí)現(xiàn)。

1、自定義ConcatLongStringUDF

/**
  * 將兩個(gè)字段拼接起來(lái)(使用指定的分隔符)
  */
class ConcatLongStringUDF extends UDF3[Long, String, String, String] {
  override def call(v1: Long, v2: String, spilt: String): String = {
    v1.toString + spilt + v2
  }
}

這里自定義UDF來(lái)使用指定的分隔符來(lái)拼接Long和String

2、使用
首先注冊(cè)自定義UDF并指定返回類型

spark.udf.register("concat_long_str", new ConcatLongStringUDF(), DataTypes.StringType)

使用自定義UDF

spark.sql("select concat_long_str(session_id,page_id,':') from temp_session_page").show()

完成代碼UDFTest

object UDFTest {
  def main(args: Array[String]): Unit = {
    //權(quán)限問(wèn)題
    System.setProperty("HADOOP_USER_NAME", "hadoop")
    val spark =
      SparkSession.builder()
        .appName("UDFTest")
        .master("local[1]")
        .getOrCreate()

    spark.udf.register("concat_long_str", new ConcatLongStringUDF(), DataTypes.StringType)

    val tempSchema: StructType = StructType(Seq(
      StructField("session_id", LongType, false),
      StructField("page_id", StringType, false)
    ))

    val rowRDD =
      spark.sparkContext.parallelize(Array("1,page1", "2,page2"))
        .map(line => {
          val fields = line.split(",")
          Row(fields(0).toLong, fields(1))
        })

    val tempDF = spark.createDataFrame(rowRDD, tempSchema)
    tempDF.createOrReplaceTempView("temp_session_page")

    spark.sql("select * from temp_session_page").show()
    spark.sql("select concat_long_str(session_id,page_id,':') from temp_session_page").show()
  }
}

打印結(jié)果

+----------+-------+
|session_id|page_id|
+----------+-------+
|         1|  page1|
|         2|  page2|
+----------+-------+

+-------------------------------------------+
|UDF:concat_long_str(session_id, page_id, :)|
+-------------------------------------------+
|                                    1:page1|
|                                    2:page2|
+-------------------------------------------+

可以根據(jù)自己業(yè)務(wù)的需求定制更多UDF

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容