在尝试将数据插入Oracle DB时,在运行以下程序时获得unicodeerror。
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()
在设置PYTHONIOENCODING=utf8之前设置了Spark作业,解决了dataframe.show()的问题。并且还# -- coding: utf-8 --帮助解决了python打印语句。
虽然现在我甚至在数据帧正确显示数据后出现错误。将数据框转换为列表是问题倾向于发生的地方,请您指出还需要做些什么。
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'abcdxe9', 3), (340, u'Japan', 4), (341, u'Austrxf2alia', 5), (341, u'China', 6)]
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不能使用unicode数据,但打印出元组列表中的每个元素给了我确切的输出,如下所示
[('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数据处理
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
在cx_Oracle连接中提供编码属性
con = cx_Oracle.connect(connection_string, encoding = "UTF-8", nencoding = "UTF-8")
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。