问题很简单。请遵守以下代码。
@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.DataFrame
或spark.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还要尝试推断数据类型?
任何帮助将不胜感激!