sql-server - 从 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
感谢你的帮助!
解决方案
推荐阅读
- r - matchit 包每次都会产生不同的结果吗?
- html - 如何使用 jquery 获取输入值
- python - 如何在 python 中操作 txt 文件全部为小写?
- python - 如何打印新创建的不和谐文本频道的 ID?
- c++ - C++嵌套开关重复值错误
- apache-flink - 如果一个键再也见不到,那么没有 TTL 的键控窗口全局状态会发生什么?
- python - 如何使用 numpy einsum 函数对 3D 数组执行矩阵乘法以获得 2D 乘积矩阵?
- sql - Sequelize 计数和组嵌套包含
- scala - 无法在我自己的代码/函数中使用加特林表达式语言
- python - Beeware'公文包创建'要求开罗> = 1.15.10