PySpark - UnicodeEncodeError:'ascii'编解码器无法编码字符

sal*_*ent 8 python python-2.7 apache-spark pyspark

将带有外来字符(åäö)的数据框加载到Spark中,使用spark.read.csv,encoding='utf-8'并尝试执行简单的show().

>>> df.show()

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/spark/python/pyspark/sql/dataframe.py", line 287, in show
print(self._jdf.showString(n, truncate))
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufffd' in position 579: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

我认为这可能与Python本身有关但我无法理解这里提到的任何技巧如何在PySpark和show() - 函数的上下文中应用.

Jus*_*ala 18

https://issues.apache.org/jira/browse/SPARK-11772讨论了这个问题并提供了一个运行的解决方案:

export PYTHONIOENCODING=utf8
Run Code Online (Sandbox Code Playgroud)

在跑步之前pyspark.我想知道为什么上面的工作,因为即使没有它我也会sys.getdefaultencoding()回来utf-8.

如何在Python 3中设置sys.stdout编码?还讨论了这个问题并为Python 3提供了以下解决方案:

import sys
sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf8', buffering=1)
Run Code Online (Sandbox Code Playgroud)

  • 是的,它正在工作..在火花提交之前导出它 export PYTHONIOENCODING=utf8 (2认同)

小智 6

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
Run Code Online (Sandbox Code Playgroud)

这对我有用,我预先设置了编码并且它在整个脚本中都是有效的。