我正在将数据库从 SQL Server 迁移到 MariaDB,但我遇到了 MariaDB 的 TIMESTAMP 范围限制的问题。
我有一个 PySpark 项目,用于填充数据库,在覆盖模式下使用 DataFrameWriter.jdbc() 创建表。当使用 SQL Server 时,Spark 将其自己的时间戳数据类型转换为 SQL Server 的 DATETIME2 数据类型,效果很好。然而,当使用 MariaDB 时,它会将其转换为 MariaDB 自己的 TIMESTAMP,其范围以 2038 年结束。这会给所有包含大于该值的表带来麻烦。
我知道 MariaDB 有一个 DATETIME 类型,它与 SQL Server 的 DATETIME 共享相同的范围,但我找不到一种方法来强制 Spark 在创建表时使用该数据类型。
我也无法手动创建该表,因为每次运行脚本时都应该重新创建该表。
最佳答案
我也面临同样的问题,当 tr so 而不是直接使用 Spark.read/write 和 jdbc 时,我使用 mysql.connection 包建立了连接。看一下:
!pip install mysql.connector
import mysql.connector
conn = mysql.connector.connect(host="localhost",port=3306, user="root", password="yourpassword", database="xyz")
cursor = conn.cursor()
Qry = "create table TempTableMaria (colA VARCHAR(50), startdate datetime(6), enddate datetime(6), colB VARCHAR(50));"
cursor.execute(Qry)
conn.commit()
conn.close()
您可以传递自定义的创建表查询,您可以在其中根据要求指定列及其数据类型,并创建具有所需架构的空表。
完成工作后,如果需要,您可以随时删除 table 。
对于其余操作,例如附加/覆盖此表,您可以随时返回 df.write.format("jdbc").... 当您现在写入此表时,数据帧的时间戳数据类型将存储为日期时间,如果您的列包含日期 9999-12-31 00:00:00.000000,则不会出现问题
希望这有帮助!
关于python - Spark DataFrameWriter 使用 TIMESTAMP 而不是 DATETIME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54806011/