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

时间:2019-02-22 16:48:59

标签: python pandas pyspark

如何在pyspark中基于panda-udf驱动列。我写的udf如下:

import 'styles/feedback.css';

有人可以帮助我确定上述代码有什么问题以及为什么它不起作用。

1 个答案:

答案 0 :(得分:0)

这将起作用:

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_udf后面不能有空行。
  • pandas Series对象不直接支持字符串函数,例如split。使用apply对每个系列进行逐元素操作。
  • 您使用了GROUPED_MAP来返回多个列,但是您的代码本质上不是按任何内容分组的。请注意,此处使用groupBy时不带任何参数。这要求所有数据都可以放在单个处理器上。