aru*_*b2w 5 python encoding utf-8 pyspark pyspark-sql
我有一个像下面这样的 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() \
Run Code Online (Sandbox Code Playgroud)
该数据库字符集源是US7ASCII,但因为有上加载的数据没有验证到Oracle它包含了各种编码字符集数据。简而言之,即使 DB 字符集是 US7ASCII,它的列中也包含 UTF8、ISO-8859-1 混合编码的数据。
我能够成功地从 Oracle 读取数据到数据帧中,没有任何问题,但由于 pyspark 强制编码为 UTF-8,导致我的一些数据具有 UTF-8 替换字符,例如EFBFA2EFBE80EFBE93,数据崩溃了由于在包含源字符集为 US7ASCII 的列中存在 Unicode 字符 E2 80 93,因此可以正确识别
该字段的类型是varchar. 存储的值是–,短划线字符。0xE2 0x80 0x93返回字节而不是字符,这些字节被转换为???.
调用DUMP(NAME,'1016')某行,其NAME值是
CLINIC – NORTH
Run Code Online (Sandbox Code Playgroud)
回报:
Typ=1 Len=69 CharacterSet=US7ASCII: 43,4f,52,41,20, e2,80,93 ,20,4e,4f,52,54,48,
因此,我希望简单地从 Oracle 读取数据,而不对我的数据进行任何编码。基本上,我不希望对正在检索的数据进行任何强制编码。我只是希望它们以它在 Oracle 中的存储方式。
有没有办法通过pyspark将此默认编码关闭为UTF-8?或者我如何让 JDBC 或 PYTHON 驱动程序以任何编码形式处理这些字符?
正如我已经提到的,因为我的数据库包含混合编码字符集,强制任何特定编码(如 UTF8/US-ASCII/ISO-8859-1)适用于某些数据,但不适用于其他数据,这就是为什么我需要一种不强制执行任何编码的方法全部。
任何帮助或指导将不胜感激。谢谢
小智 0
我不确定我的想法是否适用于您的情况,但我尝试过:
.option("encoding", "US-ASCII")
这应该改变编码。
另一个想法是如果您使用例如 pyspark,则全局设置编码:
import sys
reload(sys) #reload seems to be important, otherwise next step can break
sys.setdefaultencoding('us-ascii')
Run Code Online (Sandbox Code Playgroud)