关闭pysp中的“强制UTF8编码”

2024-10-02 06:20:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似下面的python代码,可以使用pyspark从Oracle读取数据。在

tableDF = spark.read \
            .format("jdbc") \
            .option("driver", "oracle.jdbc.driver.OracleDriver") \
            .option("url", "jdbc:oracle:thin:@" + hostid + ".dev.com:1521/" + databaseinstance) \
            .option("dbtable", sqlstring) \
            .option("numPartitions", 1) \
            .option("fetchsize", fetchsize) \
            .option("user", contextname) \
            .option("password", contextname) \
            .load() \

数据库源字符集是US7ASCII,但由于在将数据加载到Oracle时没有进行验证,因此它包含具有各种编码字符集的数据。在nut shell中,即使DB charset是US7ASCII,它的列中也有UTF8、ISO-8859-1混合编码的数据。

我能够成功地将数据从Oracle读取到数据帧中,没有任何问题,但是由于pyspark强制编码到UTF-8,数据崩溃了,这导致我的一些数据具有UTF-8替换字符,如EFBFA2EFBE80EFBE93,由于包含US7ASCII源字符集的列中的Unicode字符E2 80 93

字段的类型是varchar。存储的值是,即en dash character。返回的不是字符,而是0xE2 0x80 0x93字节,这些字节被转换成???。在

NAME值为的行调用DUMP(NAME,'1016')

^{pr2}$

退货:

Typ=1 Len=69 CharacterSet=US7ASCII: 43,4f,52,41,20,e2,80,93,20,4e,4f,52,54,48,

所以,我只想从Oracle中读取数据,而不需要对数据进行任何编码。基本上,我不想对正在检索的数据进行任何强制编码。我只想让它们像在甲骨文中那样存储。在

有没有办法关闭pyspark对UTF-8的默认编码? 或 如何让JDBC或PYTHON驱动程序以任何编码形式处理这些字符?在

正如我已经提到的,因为我的数据库包含混合编码字符集,强制执行任何特定的编码,如UTF8/US-ASCII/ISO-8859-1,对某些数据有效,但对其他数据无效,这就是为什么我需要一种完全不强制执行任何编码的方法。

任何帮助或指导将不胜感激。谢谢


Tags: 数据编码driver读取数据字符utfpysparkoracle
1条回答
网友
1楼 · 发布于 2024-10-02 06:20:55

我不确定我的想法对你是否有效,但我试过了:

.option("encoding", "US-ASCII")

这应该会改变编码方式。在


另一种方法是全局设置编码,如果使用pyspark:

import sys 
reload(sys) #reload seems to be important, otherwise next step can break
sys.setdefaultencoding('us-ascii')

相关问题 更多 >

    热门问题