Pyspark 日志记录:在错误的日志级别打印信息
Pyspark Logging: Printing information at the wrong log level
感谢您的宝贵时间!
我想在调试我的代码时为我的(大量)数据创建清晰的摘要并将其打印到我的输出中,但一旦完成就停止创建和打印这些摘要以加快速度。我被建议使用我实现的日志记录。它按预期方式将文本字符串打印为输出消息 - 但是在打印数据帧摘要时,它似乎忽略了日志级别,创建它们并始终打印它们。
记录是否正确,或者有更好的方法吗?我可以 #block 代码行或使用 if 语句等,但这是一个庞大的代码,我知道我将来需要在添加更多元素时进行相同的检查 - 看起来就像日志记录应该工作的一样。
from pyspark.sql.functions import col,count
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
df = spark.createDataFrame([(1,2),(3,4)],["COLA","COLB"])
print "1"
logger.setLevel(logging.DEBUG)
logger.debug("1 - DEBUG - Print the message and show the table")
logger.debug(df.show())
print "2"
logger.setLevel(logging.INFO)
logger.debug("2 - INFO - Don't print the message or show the table")
logger.debug(df.show())
print "3"
logger.setLevel(logging.INFO)
logger.debug("3 - INFO - Don't print the message or show the collected data")
logger.debug(df.collect())
print "4"
logger.setLevel(logging.DEBUG)
logger.debug("4 - DEBUG - Print the message and the collected data")
logger.debug(df.collect())
输出:
1
DEBUG:__main__:1 - DEBUG - Print the message and show the table
+----+----+
|COLA|COLB|
+----+----+
| 1| 2|
| 3| 4|
+----+----+
DEBUG:__main__:None
2
+----+----+
|COLA|COLB|
+----+----+
| 1| 2|
| 3| 4|
+----+----+
3
4
DEBUG:__main__:4 - DEBUG - Print the message and the collected data
DEBUG:__main__:[Row(COLA=1, COLB=2), Row(COLA=3, COLB=4)]
Logging 按预期工作,如果我们使用 df.show()
(或)df.collect()
是 spark 执行的动作,那么即使它们在 logger.debug
.
如果我们将日志级别设置为DEBUG
那么我们可以看到INFO
级别的日志。
如果我们将日志级别设置为INFO
那么我们将看不到DEBUG
级别的日志。
您可以采取的一种解决方法是将 collect()/take(n)
结果存储到一个变量中,然后在您的日志记录中使用该变量。
from pyspark.sql.functions import col,count
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
df = spark.createDataFrame([(1,2),(3,4)],["COLA","COLB"])
#storing results but don't use collect on huge dataset instead use `.take`
res=df.collect()
#get 10 records from df
res=df.take(10)
print "1"
#1
logger.setLevel(logging.DEBUG)
logger.debug("1 - DEBUG - Print the message and show the table")
#DEBUG:__main__:1 - DEBUG - Print the message and show the table
logger.debug(res)
#DEBUG:__main__:[Row(COLA=1, COLB=2), Row(COLA=3, COLB=4)]
print "2"
#2
logger.setLevel(logging.INFO)
logger.debug("2 - INFO - Don't print the message or show the table")
logger.debug(res) #this won't print as loglevel is INFO.
logger.info("result: " + str(res)) #this will get printed out
#INFO:__main__:result: [Row(COLA=1, COLB=2), Row(COLA=3, COLB=4)]
使用代替.collect()
。
感谢您的宝贵时间!
我想在调试我的代码时为我的(大量)数据创建清晰的摘要并将其打印到我的输出中,但一旦完成就停止创建和打印这些摘要以加快速度。我被建议使用我实现的日志记录。它按预期方式将文本字符串打印为输出消息 - 但是在打印数据帧摘要时,它似乎忽略了日志级别,创建它们并始终打印它们。
记录是否正确,或者有更好的方法吗?我可以 #block 代码行或使用 if 语句等,但这是一个庞大的代码,我知道我将来需要在添加更多元素时进行相同的检查 - 看起来就像日志记录应该工作的一样。
from pyspark.sql.functions import col,count
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
df = spark.createDataFrame([(1,2),(3,4)],["COLA","COLB"])
print "1"
logger.setLevel(logging.DEBUG)
logger.debug("1 - DEBUG - Print the message and show the table")
logger.debug(df.show())
print "2"
logger.setLevel(logging.INFO)
logger.debug("2 - INFO - Don't print the message or show the table")
logger.debug(df.show())
print "3"
logger.setLevel(logging.INFO)
logger.debug("3 - INFO - Don't print the message or show the collected data")
logger.debug(df.collect())
print "4"
logger.setLevel(logging.DEBUG)
logger.debug("4 - DEBUG - Print the message and the collected data")
logger.debug(df.collect())
输出:
1
DEBUG:__main__:1 - DEBUG - Print the message and show the table
+----+----+
|COLA|COLB|
+----+----+
| 1| 2|
| 3| 4|
+----+----+
DEBUG:__main__:None
2
+----+----+
|COLA|COLB|
+----+----+
| 1| 2|
| 3| 4|
+----+----+
3
4
DEBUG:__main__:4 - DEBUG - Print the message and the collected data
DEBUG:__main__:[Row(COLA=1, COLB=2), Row(COLA=3, COLB=4)]
Logging 按预期工作,如果我们使用 df.show()
(或)df.collect()
是 spark 执行的动作,那么即使它们在 logger.debug
.
如果我们将日志级别设置为
DEBUG
那么我们可以看到INFO
级别的日志。如果我们将日志级别设置为
INFO
那么我们将看不到DEBUG
级别的日志。
您可以采取的一种解决方法是将 collect()/take(n)
结果存储到一个变量中,然后在您的日志记录中使用该变量。
from pyspark.sql.functions import col,count
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
df = spark.createDataFrame([(1,2),(3,4)],["COLA","COLB"])
#storing results but don't use collect on huge dataset instead use `.take`
res=df.collect()
#get 10 records from df
res=df.take(10)
print "1"
#1
logger.setLevel(logging.DEBUG)
logger.debug("1 - DEBUG - Print the message and show the table")
#DEBUG:__main__:1 - DEBUG - Print the message and show the table
logger.debug(res)
#DEBUG:__main__:[Row(COLA=1, COLB=2), Row(COLA=3, COLB=4)]
print "2"
#2
logger.setLevel(logging.INFO)
logger.debug("2 - INFO - Don't print the message or show the table")
logger.debug(res) #this won't print as loglevel is INFO.
logger.info("result: " + str(res)) #this will get printed out
#INFO:__main__:result: [Row(COLA=1, COLB=2), Row(COLA=3, COLB=4)]
使用.collect()
。