为什么我的python udf在redshift中返回空输出?

时间:2018-04-26 10:06:09

标签: python amazon-redshift user-defined-functions

我有一个包含一个包含不同格式的日期时间值的列的表 - 毫秒,没有毫秒,零填充,没有零填充。 我需要使用该数据来计算时间间隔。所以,我编写了一个python UDF函数,并尝试在我的查询中调用它。但是当在表上调用时我得到空值并且在用字符串调用时出错。 我的UDF功能是:

create or replace function everyonesdb.validateDate(tzDate varChar)
  returns varchar
stable
as $$
    from datetime import datetime
    try:
        return datetime.strftime(datetime.strptime(tzDate,'%Y-%m-%d %H:%M:%S:%f %z'),'%Y-%m-%d %H:%M:%S %z')
    except ValueError:
        pass
$$ language plpythonu;

我这样称呼它:

Select validateDate('2018-04-19 09:29:52 +1000')

我收到错误:

[Amazon](500310) Invalid operation: function validatedate("unknown") is not unique;

我也在我的查询中尝试过。有了这个,我就得到空值。

SELECT DISTINCT date_time_tz,
   validateDate(date_time_tz) from table1

O / P:

     date_time_tz                   validatedate
    2018-04-19 12:37:33:359 +0800   
    2018-04-19 10:23:27:492 +1000   
    2018-04-19 11:02:58:810 +1000   
    2018-04-19 09:39:42:820 +1000   
    2018-04-19 10:30:18:017 +0530   
    2018-04-19 16:14:49:581 +1000   

这是我第一次尝试使用Python UDF。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

validateDate('2018-04-19 09:29:52 +1000')

由于某种原因(可能是SQL和Python之间的数据类型的映射),字符串无法识别为varchar。尝试明确指定数据类型以避免该问题

validateDate('2018-04-19 09:29:52 +1000'::varchar)

在查询中,您使用datetime上的函数,看起来它接受datetime作为varchar参数,但代码抛出异常并在pass行结束,返回null。尝试对第二个查询执行相同操作(添加::varchar

答案 1 :(得分:0)

这对我有用,可根据需要进行修改。不确定完全你的错误。

CREATE OR REPLACE FUNCTION f_validate_date(tz_date VARCHAR(50))
    RETURNS TIMESTAMP
STABLE
AS $$
    if tz_date is None:
        return None
    else:
        from datetime import datetime
        dtm = datetime.strptime(tz_date,'%Y-%m-%d %H:%M:%S:%f')
        return dtm
$$ LANGUAGE plpythonu
;

结果

SELECT f_validate_date('2018-05-01 18:18:00:000');
   f_validate_date
---------------------
 2018-05-01 18:18:00

或者你可以用老式的方式做到这一点。它更快,但不像分号毫秒分隔符。

SELECT '2018-05-01 18:18:00.000'::TIMESTAMP;
      timestamp
---------------------
 2018-05-01 18:18:00

--Leading zeroes
SELECT '0002018-05-01 18:18:00.000'::TIMESTAMP;
      timestamp
---------------------
 2018-05-01 18:18:00