我已经完成了Pyspark数据框的逻辑,现在必须应用不同的输入并合并结果。
我想知道创建UDF并多次调用它是否对性能有好处,而不是像下面那样循环遍历这些值。
### res_schema definition ###
twr = []
twr.append((330,900,900,18900,1))
twr.append((480,900,1800,27000,2))
twr.append((660,900,3600,36000,4))
twr.append((1440,0,25200,43200,1))
twr.append((10080,0,86400,259200,1))
results = []
for tup in twr:
I = tup[0]
R = tup[1]
SR = tup[2]
SW = tup[3]
NR = tup[4]
res = spark.sql(
"""
SELECT *, LAST_VALUE(offdate) OVER (
PARTITION BY name
ORDER BY CAST(ondate AS timestamp)
RANGE BETWEEN CURRENT ROW AND INTERVAL {0} MINUTES FOLLOWING
) AS ld, SUM(works) OVER (
PARTITION BY name
ORDER BY CAST(ondate AS timestamp)
RANGE BETWEEN CURRENT ROW AND INTERVAL {0} MINUTES FOLLOWING
) AS ws
FROM lc
""".format(I))
for r in res:
results.append(r)
### More logic ###
resdf = spark.createDataFrame(results, res_schema)
我的附加逻辑是广泛的,但仍然完全是sql火花,因此我不确定运行缓慢是由于查询还是for循环引起的。
答案 0 :(得分:0)
我认为将DF转换为List然后再次将其转换为DF是不理想的。当将DF转换为List时,您将利用pyspark的优势,例如处理大量数据和并行性。
您应该尝试根据DF上的map,filter,reduce函数建模逻辑,而不是用于创建列表并在列表上应用逻辑。
答案 1 :(得分:0)
最好避免UDF 以获得更好的性能,尤其是在Pyspark中,因为它将生成单独的python进程。
接下来,如果要从行“ r”获取列值,则可以尝试使用内置的 collect_list 或 collect_set 函数。