首页 > 解决方案 > 从 pyspark 代码将数据向上插入 SQL Server

问题描述

我有一个 pyspark 数据框,我想将其插入到 SQL Server 表中。我正在查看df.write模式,但没有看到任何 upsert 选项。因此,我尝试将数据帧以 parquet 格式写入 HDFS,然后使用 --update-mode allowinsert 对文件进行 sqoop。但是,我不断收到以下错误:

更新线程中出现异常:com.microsoft.sqlserver.jdbc.SQLServerException:一个或多个值超出 datetime2 SQL Server 数据类型的值范围

我试图将文件写为 csv 只是为了检查文件中的内容/时间戳是否超出范围,但是时间戳是正确的。

有人能够将 pyspark 数据帧写入 SQL Server 表吗?

这是将 DF 写入 HDFS 的函数:

def write_df_to_hdfs(df, filename, hdfs_location_working):
        """
        Function to write delta records dataframe to HDFS
        """
        logging.info("Started writing delta records dataframe to hdfs")
        df.write.save(hdfs_location_working, format='parquet', mode='append', timestampFormat='YYYY-MM-dd hh:mm:ss.SSS',emptyValue="")
        logging.info("Successfully written delta records dataframe to hdfs")

此外,这是我用来将该数据写入 SQL Server 的 sqoop 命令:

sqoop export -Dmapreduce.map.memory.mb=4096 -Dmapreduce.map.java.opts=-Xmx3000m -Dmapred.job.queuename=ici -Dsqoop.export.records.per.statement=30 -Dsqoop.export.statements.per.transaction=30 -libjars /opt/cloudera/parcels/CDH-7.1.6-1.cdh7.1.6.p6.12486751/lib/sqoop/lib/sqljdbc.jar --connect "jdbc:sqlserver://*******.hosts.cloud.ford.com;databaseName=SQTDIAPM_AM;schema=dbo;" \
--username 'user' \
--password 'pwd' \
--export-dir <HDFS Path> \
--table <tablename> \
--input-null-string '""' \
--input-null-string '\\N' \
--input-null-non-string '\\N' \
--update-key col1,col2 \
--update-mode allowinsert \
--batch \
-m 40 \
--verbose

感谢你的帮助!

标签: sql-serverapache-sparkpysparksqoop

解决方案


推荐阅读