首页 > 解决方案 > 将数据从 SQL Server 插入到 Postgres - UTF8 0x00 错误

问题描述

我正在使用 PySpark 从 SQL Server 读取数据并将其写入 AWS 上的 Postgres DB。

INSERT到 Postgres 失败并出现此错误

错误:编码“UTF8”的字节序列无效:0x00

我一直在寻找修复方法,但没有运气。我用来查找 char(0) 的语句说在任何列中都没有。我正在使用这个

cast(ExportName AS varchar) like '%' + char(0) +'%'

替换不起作用。

我尝试使用更改 pyspark 脚本中的编码

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

但仍然收到错误。

任何帮助是极大的赞赏。

编辑:这是完整的 pyspark 代码

# pyspark --jars /deployment/mssql-jdbc-9.2.0.jre8.jar,/deployment/postgresql-42.2.11.jar --num-executors 3 --executor-cores 8 --executor-memory 16g
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSession
 
conf = SparkConf()
conf.setMaster("local").setAppName("My app")
 
sc = SparkContext.getOrCreate(conf=conf)
spark = SparkSession(sc)

ms_url = "jdbc:sqlserver://hostname;instanceName=instance;databaseName=database;"
ms_user = "username"
ms_password  = "password"
mssql_query = ''' (SELECT *
                FROM DBO.TBL_SENSORS
                WHERE TYPE IN ('S','C')) query'''
 
jdbcDF = spark.read.format("jdbc") \
    .option("url", ms_url) \
    .option("dbtable", mssql_query) \
    .option("user", ms_user) \
    .option("password", ms_password) \
    .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \
    .load()

pg_url = "jdbc:postgresql://hostname:5432/database"
pg_user = "pg_username"
pg_password = "pg_password"
pg_table = "SCO.TBL_SENSORS"

jdbcDF.write.format("jdbc") \
    .option("driver", "org.postgresql.Driver") \
    .option("url", pg_url)\
    .option("user", pg_user) \
    .option("password", pg_password) \
    .option("dbtable", pg_table) \
    .mode("append") \
    .save()

标签: sql-serverpostgresqlpysparkutf-8

解决方案


推荐阅读