【问题标题】:Spark DataFrameWriter uses TIMESTAMP instead of DATETIMESpark DataFrameWriter 使用 TIMESTAMP 而不是 DATETIME
【发布时间】:2019-02-21 11:28:07
【问题描述】:

我正在将我的数据库从 SQL Server 迁移到 MariaDB,但我遇到了 MariaDB 的 TIMESTAMP 范围限制的问题。

我有一个填充数据库的 PySpark 项目,在覆盖模式下使用 DataFrameWriter.jdbc() 创建表。在使用 SQL Server 时,Spark 将自己的 Timestamp 数据类型转换为 SQL Server 的 DATETIME2 数据类型,这样就可以正常工作了。但是,在使用 MariaDB 时,它会将其转换为 MariaDB 自己的 TIMESTAMP,其范围以 2038 年结束。这会给所有包含大于该值的表带来麻烦。

我知道 MariaDB 有一个 DATETIME 类型,它与 SQL Server 的 DATETIME 共享相同的范围,但我找不到强制 Spark 在创建表时使用该数据类型的方法。

我也无法手动创建表,因为它应该在每次我的脚本运行时重新创建。

【问题讨论】:

  • 有时间范围限制的数据库?你确定吗?
  • 也许尝试在火花端转换为字符串并在数据库端转换为日期时间
  • @sramalingam24:是的,您也可以查看 MariaDB 知识库:mariadb.com/kb/en/library/timestamp。将数据存储为字符串可以避免脚本崩溃,但我宁愿使用 datetime 数据类型。我想如果没有更好的方法来强制这样做,我可以这样做......
  • @sramalingam24 - 您是否建议每个数据库都应该能够处理 10000 年?我怀疑大多数都停在 9999。那么大爆炸时期的大负数呢?

标签: python mysql apache-spark pyspark mariadb


【解决方案1】:

我也面临同样的问题,当我使用 mysql.connection 包而不是直接使用 spark.read/write 和 jdbc 时,我建立了连接。看这里:

!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()

您可以传递一个定制的创建表查询,您可以在其中根据要求指定列及其数据类型,并使用所需的架构创建一个空表。

完成工作后,如果需要,您可以随时放下桌子。

对于附加/覆盖此表等其余操作,您始终可以返回到 df.write.format("jdbc")...。当您现在写入此表时,您的数据帧的时间戳数据类型将存储为日期时间,如果您的列包含日期 9999-12-31 00:00:00.000000,则不会出现任何问题

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 2016-10-05
    • 2021-06-30
    • 2017-05-17
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    相关资源
    最近更新 更多