Spark SQL UDF(日期转换)
2018-10-10 本文已影响0人
hipeer
-
使用 Java API 获取日历对象
// 到入需要的java类 import java.util.Calendar import java.text.SimpleDateFormat def getDate(date: String): Calendar = { val theDate = (new SimpleDateFormat("yyyy-MM-dd")).parse(date) val calendar = Calendar.getInstance() calendar.setTime(theDate) calendar }
-
通过日期计算星期的函数
// 第一种利用Canlender类 def getDayOfWeek(date: String): Int = { val theDay = getDate(date).get(Calendar.DAY_OF_WEEK) - 1 if (theDay == 0) 7 else theDay } // 第二种直接利用SimpleDateFormat类, 这个好一点 def getDayOfWeek = (date: String) => (new SimpleDateFormat("u")).format(new SimpleDateFormat("yyyy-MM-dd").parse(date)) // 注册函数 spark.udf.register("dayOfWeek", (date: String) => getDayOfWeek(date)) 或 import org.apache.spark.sql.functions.udf val day_Of_Week = udf((date: String) => getDayOfWeek(date))
- 使用方式(假设有一个usersDF数据集):
usersDF.createOrReplaceTempView("users") spark.sql("select dayOfWeek(joined_date) from users").show 或 usersDF.select(day_Of_Week($"joined_date")).show
注:使用spark.udf.register()注册的方法只能在sql中用,在DataFrame API中不可用。第二种方式在DF API中能用,在SQL中不能用。
-
计算月份的函数
def getMonth(date: String): Int = setDate(date).get(Calendar.MONTH) + 1 val month_Of_Year = udf((date: String) => getMonth(date))
注:该函数在DataFrame API中使用,在sql中有date_format()函数可以直接用