본문 바로가기

소프트웨어-이야기/데이터 저장소 + 시각화

[Spark]User Define Function

spark에서 sql을 날릴 때, 사용자가 커스텀하게 만든 함수를 사용할 수 있게 하는 방법이 있다.


SPARK의 UDFs ( User-Defined Functions ) 개념을 사용하면 된다.


UDF는 우리가 피요한 새로운 컬럼 기반의 함수를 만들어준다. User Define Functions는 데이터셋을 가공해주는 Spark SQL DSL의 함수들을 확장시켜준다.


아래처럼 쓰면 된다고 한다. udf 함수에 내가 정의한 함수의 파라미터를 넘겨주면 된다.


val dataset = Seq((0, "hello"), (1, "world")).toDF("id", "text")

// Define a regular Scala function
val upper: String => String = _.toUpperCase

// Define a UDF that wraps the upper Scala function defined above
// You could also define the function in place, i.e. inside udf
// but separating Scala functions from Spark SQL's UDFs allows for easier testing
import org.apache.spark.sql.functions.udf
val upperUDF = udf(upper)

// Apply the UDF to change the source dataset
scala> dataset.withColumn("upper", upperUDF('text)).show
+---+-----+-----+
| id| text|upper|
+---+-----+-----+
|  0|hello|HELLO|
|  1|world|WORLD|
+---+-----+-----+


SQL 쿼리문에서도 UDF 함수를 사용하고 싶으면, UDFRegistration에 udf 함수를 등록해줘야한다.

SessionState.udf 속성을 사용하면, UDFRegistration에 접근할 수 있다.

아래처럼 사용해주면 된다. ㅎㅎ spark.udf.register("내가만든 함수명", 오퍼레이션)


val spark: SparkSession = ...
spark.udf.register("myUpper", (s: String) => s.toUpperCase)

val strs = ('a' to 'c').map(_.toString).toDS
strs.registerTempTable("strs")

scala> sql("SELECT *, myUpper(value) UPPER FROM strs").show
+-----+-----+
|value|UPPER|
+-----+-----+
|    a|    A|
|    b|    B|
|    c|    C|
+-----+-----+


이 내용은 spark 2를 기반으로 하고있슴다 ㅎㅎ 


참고 : 

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-udfs.html

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-sparksession.html#udf


끝!