是否通过PySpark pandas_udf数据限制?

时间:2019-05-31 18:44:14

标签: python python-3.x pyspark user-defined-functions databricks

问题很简单。请遵守以下代码。

@pyf.pandas_udf(pyt.StructType(RESULTS_SCHEMA_LIST), pyf.PandasUDFType.GROUPED_MAP)
def train_udf(df):
    return train_ml_model(df=df)

results_df = complete_df.groupby('training-zone').apply(train_udf)

results_df的一列通常是一个很大的字符串(> 4e6个字符)。当我将熊猫数据帧转换为spark数据帧时,对于pandas.DataFramespark.DataFrame来说这不是问题。 pandas_udf()尝试执行此操作时会出现问题。返回的错误是pyarrrow.lib.ArrowInvalid could not convert **string** with type pyarrow.lib.StringValue: did not recognize the Python value type when inferring an Arrow data type

如果我不返回有问题的列,或者使有问题的列仅包含一些小字符串(例如“哇哇,很酷”),则此UDF会起作用,因此我知道问题不在于udf本身。

我知道函数train_ml_model()起作用的原因是,当我从spark数据帧中获得一个随机组,然后将其转换为pandas数据帧,并将其传递给train_ml_model()时,它会产生预期的pandas数据帧,其中的列带有大量串。

我知道spark可以处理这么大的字符串,因为当我使用spark.createDataFrame()将pandas数据帧转换为spark数据帧时,spark数据帧包含了完整的期望值。

PS:当我将类型传递给pandas_udf()时,为什么pyarrow还要尝试推断数据类型?

任何帮助将不胜感激!

0 个答案:

没有答案