Pyspark - UnicodeEncodeError: 'ascii' codec can't encode character
Pyspark - UnicodeEncodeError: 'ascii' codec can't encode character
获取 unicodeerror 而 运行 在尝试将数据插入 Oracle DB 时执行以下程序。
# -*- coding: utf-8 -*-
#import unicodedata
from pyspark.sql import SparkSession
from pyspark.sql import SQLContext
from pyspark.sql.types import *
from pyspark.sql.functions import udf
import sys
print(sys.getdefaultencoding())
u = 'abcdé'
a = 'Austròalia'
print(u)
print(a)
spark = SparkSession.builder.master("local") \
.appName("Unicode_Error") \
.getOrCreate()
sqlContext = SQLContext(spark)
l = [(340, 'India',1),(340, 'Canada',2),(341, u'abcdé',3),(340, 'Japan',4),(341, u'Austròalia',5),(341, 'China',6)]
df = sqlContext.createDataFrame(l, ['CUSTOMER_ID', 'COUNTRY', 'LINENUMBER'])
df.show()
data_tuples = [tuple(x) for x in df.rdd.collect()]
print(str(data_tuples))
print(type(data_tuples))
query = "INSERT INTO CUSTOMERS VALUES (:1, :2, :3)"
cur = con.cursor()
cur.prepare(query)
cur.executemany(None, data_tuples)
con.commit()
cur.close()
con.close()
在提交 Spark 作业之前设置了 PYTHONIOENCODING=utf8
,这解决了 dataframe.show() 的问题。 # -*- coding: utf-8 -*-
还帮助解决了 python 打印语句。
虽然现在即使在数据框正确显示数据后我也会收到错误消息。 dataframe 转换为 list 是容易出问题的地方,请问还有什么需要做的吗?
ascii
abcdé
Austròalia
+-----------+----------+----------+
|CUSTOMER_ID| COUNTRY|LINENUMBER|
+-----------+----------+----------+
| 340| India| 1|
| 340| Canada| 2|
| 341| abcdé| 3|
| 340| Japan| 4|
| 341|Austròalia| 5|
| 341| China| 6|
+-----------+----------+----------+
[(340, u'India', 1), (340, u'Canada', 2), (341, u'abcd\xe9', 3), (340, u'Japan', 4), (341, u'Austr\xf2alia', 5), (341, u'China', 6)]
<type 'list'>
> Traceback (most recent call last): cur.executemany(None, data_tuples)
> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in
> position 4: ordinal not in range(128)
元组列表有 unicode 数据,encode
的用法不可能在同一个上,但是打印出元组列表中的每个元素给了我如下的确切输出
[('340', "u'India'", '1'), ('340', "u'Canada'", '2'), ('341', "u'abcd\xe9'", '3'), ('340', "u'Japan'", '4'), ('341', "u'Austr\xf2alia'", '5'), ('341', "u'China'", '6')]
***********************
India
340
India
1
340
Canada
2
341
abcdé
3
340
Japan
4
341
Austròalia
5
341
China
6
此问题已通过在通过 cx_Oracle 连接到 Oracle 时传递附加参数来解决。
设置 python 环境的编码方法以支持 Unicode 数据处理
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
在 cx_Oracle 连接中提供编码属性
con = cx_Oracle.connect(connection_string, encoding = "UTF-8", nencoding = "UTF-8")
您可以参考 https://github.com/oracle/python-cx_Oracle/issues/36 以获得更多相同的想法。
获取 unicodeerror 而 运行 在尝试将数据插入 Oracle DB 时执行以下程序。
# -*- coding: utf-8 -*-
#import unicodedata
from pyspark.sql import SparkSession
from pyspark.sql import SQLContext
from pyspark.sql.types import *
from pyspark.sql.functions import udf
import sys
print(sys.getdefaultencoding())
u = 'abcdé'
a = 'Austròalia'
print(u)
print(a)
spark = SparkSession.builder.master("local") \
.appName("Unicode_Error") \
.getOrCreate()
sqlContext = SQLContext(spark)
l = [(340, 'India',1),(340, 'Canada',2),(341, u'abcdé',3),(340, 'Japan',4),(341, u'Austròalia',5),(341, 'China',6)]
df = sqlContext.createDataFrame(l, ['CUSTOMER_ID', 'COUNTRY', 'LINENUMBER'])
df.show()
data_tuples = [tuple(x) for x in df.rdd.collect()]
print(str(data_tuples))
print(type(data_tuples))
query = "INSERT INTO CUSTOMERS VALUES (:1, :2, :3)"
cur = con.cursor()
cur.prepare(query)
cur.executemany(None, data_tuples)
con.commit()
cur.close()
con.close()
在提交 Spark 作业之前设置了 PYTHONIOENCODING=utf8
,这解决了 dataframe.show() 的问题。 # -*- coding: utf-8 -*-
还帮助解决了 python 打印语句。
虽然现在即使在数据框正确显示数据后我也会收到错误消息。 dataframe 转换为 list 是容易出问题的地方,请问还有什么需要做的吗?
ascii
abcdé
Austròalia
+-----------+----------+----------+
|CUSTOMER_ID| COUNTRY|LINENUMBER|
+-----------+----------+----------+
| 340| India| 1|
| 340| Canada| 2|
| 341| abcdé| 3|
| 340| Japan| 4|
| 341|Austròalia| 5|
| 341| China| 6|
+-----------+----------+----------+
[(340, u'India', 1), (340, u'Canada', 2), (341, u'abcd\xe9', 3), (340, u'Japan', 4), (341, u'Austr\xf2alia', 5), (341, u'China', 6)]
<type 'list'>
> Traceback (most recent call last): cur.executemany(None, data_tuples)
> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in
> position 4: ordinal not in range(128)
元组列表有 unicode 数据,encode
的用法不可能在同一个上,但是打印出元组列表中的每个元素给了我如下的确切输出
[('340', "u'India'", '1'), ('340', "u'Canada'", '2'), ('341', "u'abcd\xe9'", '3'), ('340', "u'Japan'", '4'), ('341', "u'Austr\xf2alia'", '5'), ('341', "u'China'", '6')]
***********************
India
340
India
1
340
Canada
2
341
abcdé
3
340
Japan
4
341
Austròalia
5
341
China
6
此问题已通过在通过 cx_Oracle 连接到 Oracle 时传递附加参数来解决。
设置 python 环境的编码方法以支持 Unicode 数据处理
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
在 cx_Oracle 连接中提供编码属性
con = cx_Oracle.connect(connection_string, encoding = "UTF-8", nencoding = "UTF-8")
您可以参考 https://github.com/oracle/python-cx_Oracle/issues/36 以获得更多相同的想法。