关于aws当中的redshift自定义函数的部署和创建(UDF)

今天在做的时候碰到,如果一个字符串是日期时间类型,但是他的这种形式是错误的,就比如:2019-02-31 

我们都知道2月份是没有31号的,所以我们要给日期附一个默认值。或者因为数据库当中的使用了varchar的类型随心所欲的乱写

各种各样的数据都有。这对于数据清洗是一件非常麻烦的事情。所以我们写一个函数,对于这种的如果是日期的就正常返回日期,如果不是的话就返回

一个默认的日期给他。redshift的自定义函数的形式如下:

--判断是不是时间戳,返回数据
CREATE or replace  FUNCTION  f_py_is_valid_timestamp (a varchar) RETURNS  varchar
    IMMUTABLE as $$
    import time
    from datetime import datetime
    def is_valid_timestamp(strdate):
				try:
					if ":" in strdate:
						if(len(strdate)==23):
						    return str((datetime.strptime(strdate, '%Y-%m-%d %H:%M:%S.%f')))
						else:
						    return str((datetime.strptime(strdate, '%Y-%m-%d %H:%M:%S')))
					elif(len(strdate)==13):
							s2 = round(int(strdate)/ 1000 - 28800)
							timeArray = time.localtime(s2)
							return str(time.strftime("%Y-%m-%d %H:%M:%S", timeArray))
					elif (len(strdate) == 14):
						b = '%s-%s-%s %s:%s:%s' % (strdate[0:4], strdate[4:6], strdate[6:8], strdate[8:10], strdate[10:12], strdate[12:16])
						return str(datetime.strptime(b, '%Y-%m-%d %H:%M:%S'))
				except Exception:
					return '1900-01-01 00:00:00'
    return 	is_valid_timestamp(a)
$$ LANGUAGE plpythonu;

  上面自定义的udf当中,我们采用的Python脚本的形式自定义的函数。在两个$符号的中间就是一段Python代码。写好这个之后就在可以在redshift的客户端界面执行以下这个函数

 需要注意的问题:

     (1)自定义函数当行Python的换行和空格符号(一定要注意否则一直报错)

     (2)在用Python写好函数之后一定要与返回值 return is_valid_timestamp(a) 这样函数才会起作用

     (3)创建的这个自定义的函数其实是以存储过程的形式存在,在创建这个函数的时候也可以指定函数创建的库名字。如下:

    

       CREATE or replace FUNCTION 数据库库名字.f_py_is_valid_timestamp (a varchar) RETURNS varchar

  

 

 至此redshift的自定义函数就设置好了。

  

 

posted on 2019-07-31 15:50  gxg123  阅读(791)  评论(0编辑  收藏  举报

导航