python - Spark DataFrameWriter 使用 TIMESTAMP 而不是 DATETIME

标签 python mysql apache-spark pyspark mariadb

我正在将数据库从 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/

相关文章:

php - PDO 不会给出结果

hadoop - 表格编程

python - 将另一列的分钟数添加到 pyspark 中的字符串时间列

python - 我如何在 Python 中为 discord 机器人创建重新加载命令?

python - 如何使用 wand-py 和 imagemagick 运行此命令

mysql - Laravel 在 whereHas 中使用 select

python - 如何使用 PySpark 计算 ADLS 中的目录大小?

python - 如何在 Python 中获取 Excel 单元格属性

javascript - Django - 使用 javascript 显示结果(错误)

MYSQL 选择大于 OR 的记录