Python Pyspark出现错误self.\u sock.recv\u进入(b)套接字。超时:超时

Python Pyspark出现错误self.\u sock.recv\u进入(b)套接字。超时:超时,python,apache-spark,pyspark,apache-spark-sql,pyspark-dataframes,Python,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Dataframes,目标是使用UDF对行进行分类。我正在windows上使用pyspark 使用简单的函数或操作(如过滤器)似乎是可行的 任何关于如何解决超时/套接字故障的指导都会很有帮助(请参阅下面的错误) 数据中没有空值 from pyspark.sql.functions import udf from pyspark.sql.types import IntegerType,StringType def BreakDown(arr_value): start_year = arr_value[0]

目标是使用UDF对行进行分类。我正在windows上使用pyspark

使用简单的函数或操作(如过滤器)似乎是可行的

任何关于如何解决超时/套接字故障的指导都会很有帮助(请参阅下面的错误)

数据中没有空值

from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType,StringType

def BreakDown(arr_value):
    start_year = arr_value[0]
    start_month = arr_value[1]
    end_year = arr_value[2]
    end_month = arr_value[3]
    curr_year = arr_value[4]
    curr_month = arr_value[5]
    if   (curr_year == start_year) & (curr_month >= start_month) : return 1
    elif   (curr_year == end_year) & (curr_month <= end_month) : return 1
    elif   (curr_year > start_year) & (curr_year < end_year) : return 1
    else: return 0

    
udfBreakDown = udf(BreakDown, IntegerType())

temp = temp.withColumn('include', udfBreakDown(F.struct('start_year','start_month','end_year','end_month','curr_year','curr_month')))
从pyspark.sql.functions导入udf
从pyspark.sql.types导入IntegerType、StringType
def故障(arr_值):
起始年=arr\u值[0]
开始月份=arr\u值[1]
年末=arr\U值[2]
月末=arr\u值[3]
当前年份=当前值[4]
当前月份=当前值[5]
如果(当前年份==开始年份)和(当前月份>=开始月份):返回1
elif(当前年份==结束年份)和(当前月份开始年份)以及(当前年份<结束年份):返回1
其他:返回0
udfBreakDown=udf(细分,IntegerType())
temp=temp.with column('include',udfBreakDown(F.struct('start\u year','start\u month','end\u year','end\u month','curr\u year','curr\u month'))
PythonException:Python工作程序引发了异常。 请参阅下面的堆栈跟踪。回溯(最近一次呼叫最后一次):
文件 “E:\spark\spark-3.0.1-bin-hadoop2.7\python\lib\pyspark.zip\pyspark\worker.py”, 第585行,在主文件中 “E:\spark\spark-3.0.1-bin-hadoop2.7\python\lib\pyspark.zip\pyspark\serializers.py”, 第593行,以read_int表示 length=stream.read(4)文件“C:\ProgramData\Anaconda3\lib\socket.py”,第669行,在readinto中 返回self.\u sock.recv\u到(b)套接字。超时:超时


如果可以使用Spark内置函数,请始终避免使用UDF。当功能如下时,您可以使用
重写逻辑:

from pyspark.sql import functions as F

def get_include_col():
    c = F.when((F.col("curr_year") == F.col("start_year")) & (F.col("curr_month") >= F.col("start_month")), F.lit(1)) \
        .when((F.col("curr_year") == F.col("end_year")) & (F.col("curr_month") <= F.col("end_month")), F.lit(1)) \
        .when((F.col("curr_year") > F.col("start_year")) & (F.col("curr_year") < F.col("end_year")), F.lit(1)) \
        .otherwise(F.lit(0))
    return c


temp = temp.withColumn('include', get_include_col())

这里不需要UDF,使用when函数。它在linux机器上工作。我更愿意编写一个可读的udf——特别是随着条件的增加。udf在pyspark中的性能很差。请不要使用它们,除非没有火花内置功能为您想要实现的。为了可读性,您还可以编写返回when列表达式的包装器函数。好的,让我按照您的建议尝试一下。Blackishop爵士-可以确认when起作用,而不需要使用任何故障来代替udf。请包括作为我接受的答案。但是,如果我再次遇到这种情况,通常可以在此时配置wiat吗?
import functools
from pyspark.sql import functions as F

cases = [
    ("curr_year = start_year and curr_month >= start_month", 1),
    ("curr_year = end_year and curr_month <= end_month", 1),
    ("curr_year > start_year and curr_year < end_year", 1)
]

include_col = functools.reduce(
    lambda acc, x: acc.when(F.expr(x[0]), F.lit(x[1])),
    cases,
    F
).otherwise(F.lit(0))

temp = temp.withColumn('include', include_col)