Python 如何在pyspark中使用UDF并在StructType中返回结果

Python 如何在pyspark中使用UDF并在StructType中返回结果,python,pandas,pyspark,Python,Pandas,Pyspark,如何在pyspark中驱动基于panda udf的专栏。我已经编写了udf,如下所示: from pyspark.sql.functions import pandas_udf, PandasUDFType @pandas_udf("in_type string, in_var string, in_numer int", PandasUDFType.GROUPED_MAP) def getSplitOP(in_data): if in_data is None or len(in_

如何在pyspark中驱动基于panda udf的专栏。我已经编写了udf,如下所示:

from pyspark.sql.functions import pandas_udf, PandasUDFType

@pandas_udf("in_type string, in_var string, in_numer int", PandasUDFType.GROUPED_MAP)

def getSplitOP(in_data):
    if in_data is None or len(in_data) < 1:
        return None
    #Input/variable.12-2017
    splt=in_data.split("/",1)
    in_type=splt[0]

    splt_1=splt[1].split(".",1)
    in_var = splt_1[0]

    splt_2=splt_1[1].split("-",1)
    in_numer=int(splt_2[0])

    return (in_type, in_var, in_numer)
    #Expected output: ("input", "variable", 12)

df = df.withColumn("splt_col", getSplitOP(df.In_data))
从pyspark.sql.functions导入pandas\u udf,PandasUDFType
@PandasUudf(“in_类型字符串、in_变量字符串、in_数值整数”,PandasUDFType.GROUPED_映射)
def getSplitOP(在_数据中):
如果in_数据为None或len(in_数据)<1:
一无所获
#2017年12月12日投入/变量
splt=in_data.split(“/”,1)
in_type=splt[0]
splt_1=splt[1]。拆分(“.”,1)
in_var=splt_1[0]
splt_2=splt_1[1]。拆分(“-”,1)
in_numer=int(splt_2[0])
返回值(单位类型、单位变量、单位数值)
#预期输出:(“输入”,“变量”,12)
df=df.withColumn(“splt\u col”,getSplitOP(df.In\u数据))
有人能帮我确定一下,上面的代码有什么问题,为什么不起作用。

这会起作用:

df = spark.createDataFrame([("input/variable.12-2017",), ("output/invariable.11-2018",)], ("in_data",))
df.show()

from pyspark.sql.functions import pandas_udf, PandasUDFType

@pandas_udf("in_type string, in_var string, in_numer int", PandasUDFType.GROUPED_MAP)
def getSplitOP(pdf):
    in_data = pdf.in_data

    #Input/variable.12-2017
    splt = in_data.apply(lambda x: x.split("/",1))
    in_type = splt.apply(lambda x: x[0])

    splt_1 = splt.apply(lambda x: x[1].split(".",1))
    in_var = splt_1.apply(lambda x: x[0])

    splt_2 = splt_1.apply(lambda x: x[1].split("-",1))
    in_numer = splt_2.apply(lambda x: int(x[0]))

    return pd.DataFrame({"in_type": in_type, "in_var": in_var, "in_numer": in_numer})
    #Expected output: ("input", "variable", 12)

df = df.groupBy().apply(getSplitOP)
df.show()
  • @pandas\u udf后面不得有空行
  • pandas系列对象不直接支持诸如split之类的字符串函数。使用
    apply
    对每个系列进行元素操作
  • 为了返回多个列,您使用了一个分组映射,但是您的代码本身并没有按任何内容分组。请注意,此处使用groupBy时没有任何参数。这需要将所有数据放在一个处理器上

查看执行此代码的结果可能很有用。为什么在这里使用udf?你可以用一个普通的udf或者甚至是标准的API函数来实现这一点。我正在寻找pandas udf,因为它比普通的udf快。所以我一直在寻找它们的实现。我相信熊猫udf比普通udf更快。