Pandas 如何在PyU udf中记录/打印消息?

Pandas 如何在PyU udf中记录/打印消息?,pandas,apache-spark,pyspark,user-defined-functions,Pandas,Apache Spark,Pyspark,User Defined Functions,我已经测试过logger和print都不能在pandas_udf中打印消息,无论是在集群模式还是客户端模式 测试代码: 导入系统 将numpy作为np导入 作为pd进口熊猫 从pyspark.sql导入SparkSession 从pyspark.sql.functions导入* 导入日志记录 logger=logging.getLogger'test' 火花=火花会话 建设者 .appName'test' .getOrCreate df=spark.createDataFramepd.DataF

我已经测试过logger和print都不能在pandas_udf中打印消息,无论是在集群模式还是客户端模式

测试代码:

导入系统 将numpy作为np导入 作为pd进口熊猫 从pyspark.sql导入SparkSession 从pyspark.sql.functions导入* 导入日志记录 logger=logging.getLogger'test' 火花=火花会话 建设者 .appName'test' .getOrCreate df=spark.createDataFramepd.DataFrame{ “y”:np.random.randint1、10、20、,, “ds”:np.random.randint10009999,20,,, 'store_id':['a']*10+['b']*7+['q']*3, “产品id”:[c']*5+[d']*12+[e']*3, } @pandas_udf'y int、ds int、商店id字符串、产品id字符串、PandasudType.MAP def系列预测PDF: 打印*100 logger.info“$”*100 记录器。错误“&”*100 返回pd.DataFrame[],列=['y','ds','store\u id','product\u id'] df1=df.groupby['store\u id','product\u id'].applytrain\u predict 另请注意:

log4jLogger=spark.sparkContext.\u jvm.org.apache.log4j LOGGER=log4jLogger.LogManager.getLogger\uuu名称__ LOGGER.info*50 您不能在udf中使用它,因为此日志超出了spark上下文对象的范围,您不能在udf中引用spark会话/上下文

我知道的唯一方法就是用exception作为我在下面写的答案。 但这很棘手,也有缺点。
我想知道是否有任何方法可以在pandas_udf中打印消息。

目前,我在spark 2.4中尝试了所有方法

没有日志,很难调试有故障的udf。我所知道的在pandas_udf中打印错误消息的唯一可行方法是raise Exception。所以用这种方法调试确实需要时间,但我知道没有更好的方法了

@pandas_udf('y int, ds int, store_id string, product_id string', PandasUDFType.GROUPED_MAP)
def train_predict(pdf):
    print('#'*100)
    logger.info('$'*100)
    logger.error('&'*100)
    raise Exception('@'*100)  # The only way I know can print message but would break execution 
    return pd.DataFrame([], columns=['y', 'ds','store_id','product_id'])

缺点是打印消息后无法保持spark运行。

可以做的一件事是将日志消息放入数据帧本身。 比如说

@pandas_udf('y int, ds int, store_id string, product_id string, log string', PandasUDFType.GROUPED_MAP)
def train_predict(pdf):
    return pd.DataFrame([3, 5, 'store123', 'product123', 'My log message'], columns=['y', 'ds','store_id','product_id', 'log'])

在此之后,您可以将包含相关信息的日志列选择到另一个数据帧中并输出到文件。从原始数据帧中删除它


它并不完美,但可能会有所帮助。

我不知道为什么人们会否决它,但它帮助我调试代码员。谢谢