Undefined function: 'current_user'. This function is neither a registered temporary function
nor a permanent function registered in the database 'default'.
current_user() 는 Spark 3.2 부터 내장된 함수다. 그 이전 버전에는 존재하지 않으므로 등록되지 않은 함수로 처리된다. Hive 에서 쓰던 쿼리를 Spark 로 옮길 때 자주 걸린다.
버전을 먼저 확인한다.
spark-submit --version
print(spark.version)
spark.sql("SHOW FUNCTIONS LIKE 'current_user'").show()
괄호 없이 써도 되고 붙여 써도 된다.
SELECT current_user();
SELECT current_user;
인증이 없는 환경에서는 프로세스를 띄운 OS 사용자 이름이 나온다. Kerberos 를 쓰면 인증된 주체의 짧은 이름이 나오고, Spark Thrift Server 에 impersonation 이 켜져 있으면 접속한 사용자 이름이 나온다.
SQL 함수 대신 Spark 컨텍스트에서 읽는다.
user = spark.sparkContext.sparkUser()
print(user)
val user = spark.sparkContext.sparkUser()
SQL 안에서 필요하면 값을 주입하거나 임시 함수를 등록한다.
user = spark.sparkContext.sparkUser()
spark.sql(f"SELECT '{user}' AS current_user")
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
spark.udf.register("current_user", udf(lambda: user, StringType()))
spark.sql("SELECT current_user()").show()
UDF 로 등록한 값은 드라이버의 사용자를 고정해 담은 것이다. 익스큐터가 다른 계정으로 돌아도 같은 값이 나오므로, 감사 목적이라면 이 점을 감안해야 한다.
| 함수 | 도입 | 내용 |
|---|---|---|
current_user() |
3.2 | 현재 사용자 |
current_catalog() |
3.1 | 현재 카탈로그 |
current_database() |
2.0 | 현재 데이터베이스 |
current_schema() |
3.4 | current_database() 의 별칭 |
current_user() 와 이름은 같지만 반환 값의 근거가 다르다. Hive 는 HiveServer2 세션 사용자를, Spark 는 Spark 컨텍스트의 사용자를 돌려준다.SHOW FUNCTIONS 에 이름이 보여도 해당 스파크 세션의 카탈로그 구현에 따라 동작이 달라질 수 있다. 실제 값을 한 번 찍어 확인한다.