我正在尝试创建一个简单的函数,它获取3个参数并将它们插入到表中(作为一行)。 现在我知道redshift不支持过程,但启用了python函数。
我有一个python函数,当在redshift外部运行时,可以完成工作。 我是如何在redhsift中实现的,所以当我从查询中调用函数时它会执行相同的操作?
这是我正在使用的python代码(在外部 redshift下工作正常):
import psycopg2
def insert_tab(arg1, arg2, arg3):
# Create connection to redshift
try:
con = psycopg2.connect("dbname= 'dev'
host='something.redshift.amazonaws.com' "
"port= '5439' user= 'user' password= 'password'")
con.autocommit = True
cur = con.cursor()
except:
print("Cannot connect to Database")
sql_statementy= "insert into table(a,b,c) values (%s, %s, %s)"
try:
cur.execute(sql_statementy, (arg1, arg2, arg3))
except:
print("insert into failed")
return
我用
运行pythonimport write_table
write_table.insert_tab('a','b','c')
如何在redshift上实现此功能,以便我可以像
一样调用该函数select insert_tab('a','b','d')
所以它会像程序一样工作吗?
答案 0 :(得分:0)
没有办法做到这一点,因为UDF是用Python编写的,用于处理标量值,数组或对象,就像普通的Python一样。您无法在Redshift中编写SQL函数。虽然对于曾经在Postgres和支持存储过程的其他关系数据库中工作的人来说似乎很奇怪,但select insert_tab('a','b','d')
是OLTP环境的包装器,对分析数据库没有任何意义。
答案 1 :(得分:0)
您实际上可以在python或sql中编写UDF (截至上周) 见http://docs.aws.amazon.com/redshift/latest/dg/user-defined-functions.html
但是存在某些限制,包括他们无法读取或写入。 事实上,他们所能做的只是返回一个值。