[英]pyspark: optimize pandas udf that performs sql query for each row in dataframe?
[英]Loop a SQL query row by row on a pandas dataframe
我有一个看起来像这样的 dataframe:
time1 val1 val2 time2
2021-01-20 07:32:39.169390+01:00 john dale 2021-01-20 15:39:47.429788+01:00
2021-01-20 20:39:18.485783+01:00 anne mckay 2021-01-20 20:40:17.176882+01:00
2021-01-20 20:45:19.155543+01:00 john dale 2021-01-20 20:40:17.176882+01:00
我有一个 postgres function 作为输入'time1','val1','val2'和'time2'返回一些输入加上两个额外的列:'val3'和'val4'。
查询将如下所示:
SELECT *
FROM schema.function('val1', 'val2', 'time1', 'time2')
并会返回:
val1 val2 val3 val4
john dale 28 80
anne mckay 45 90
john dale 65 110
我的问题是:如何逐行运行 function (或以另一种方式,但考虑到不同的行值作为输入)并将结果与原始 df 合并,以便将这个 df 作为结果?
time1 val1 val2 time2 val3 val4
2021-01-20 07:32:39.169390+01:00 john dale 2021-01-20 15:39:47.429788+01:00 28 80
2021-01-20 20:39:18.485783+01:00 anne mckay 2021-01-20 20:40:17.176882+01:00 45 90
2021-01-20 20:45:19.155543+01:00 john dale 2021-01-20 20:40:17.176882+01:00 65 110
到目前为止,我尝试做的是创建一个 function 来检索带有 4 个输入的 f 字符串的查询,如下所示:
def retrieve_val3_val4(time1, val1, val2, time2):
query = f'''
SELECT *
FROM schema.function('{val1}', '{val2}', '{time1}', '{time2}')
'''
df = pd.read_sql(query)
return df
然后尝试将 function 应用于 df,如下所示:
df.apply(lambda row: retrieve_val3_val4(row.val1, row.val2, row.time1, row.time2), axis=1)
但这会返回 object 类型而不是 df。
谢谢你的帮助!
使用横向连接。 假设原始行存储在一个表中,那么您可以使用:
select t.*, f.val3, f.val4
from t cross join lateral
schema.function(t.val1, t.val2, t.time1, t.time2) f;
您还可以使用values
来动态构造值:
select t.*, f.val3, f.val4
from (values (?, ?, ?, ?)
) v(val1, val2, time1, time2) cross join lateral
schema.function(v.val1, v.val2, v.time1, v.time2) f;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.