Python 使用PySpark UDF在超时时返回None

Python 使用PySpark UDF在超时时返回None,python,pyspark,timeout,Python,Pyspark,Timeout,我需要在PySpark上运行长时间运行的任务(udf),其中一些任务可以运行数小时,但我想添加一些超时包装,以防它们真的运行太长。如果超时,我只想返回一个None 我用信号做过一些事情,但我很确定这不是最安全的方法 导入pyspark 输入信号 导入时间 从pyspark导入SQLContext 从pyspark.sql.types导入StructType、StructField、IntegerType、StringType 从pyspark.sql.functions导入udf conf=py

我需要在PySpark上运行长时间运行的任务(udf),其中一些任务可以运行数小时,但我想添加一些超时包装,以防它们真的运行太长。如果超时,我只想返回一个
None

我用
信号做过一些事情,但我很确定这不是最安全的方法

导入pyspark
输入信号
导入时间
从pyspark导入SQLContext
从pyspark.sql.types导入StructType、StructField、IntegerType、StringType
从pyspark.sql.functions导入udf
conf=pyspark.SparkConf()
sc=pyspark.SparkContext.getOrCreate(conf=conf)
spark=SQLContext(sc)
schema=StructType([
StructField(“睡眠”,IntegerType(),True),
StructField(“值”,StringType(),True),
])
数据=[[1,“a”],[2,“b”],[3,“c”],[4,“d”],[1,“e”],[2,“f”]]
df=spark.createDataFrame(数据,schema=schema)
def处理器(信号、帧):
raise TimeoutError()
def平方_类型:
def run_timeout():
signal.signal(signal.SIGALRM,handler)
信号报警(3)
时间。睡眠时间(秒)
返回s*s
尝试:
返回运行超时()
除时间外,错误为e:
一无所获
squared_udf=udf(squared_类型,IntegerType())
df.withColumn('sq',squared_udf('sleep')).show()
它是有效的,给了我预期的输出,但是有没有一种方法可以更轻松地完成它呢


谢谢

希望这有帮助。您的代码是否适用于多个工作节点上的spark submit作业?希望这有帮助。您的代码是否适用于多个工作节点上的spark submit作业?
+-----+-----+----+
|sleep|value|  sq|
+-----+-----+----+
|    1|    a|   1|
|    2|    b|   4|
|    3|    c|null|
|    4|    d|null|
|    1|    e|   1|
|    2|    f|   4|
+-----+-----+----+