代码之家  ›  专栏  ›  技术社区  ›  Metadata

如何在pyspark dataframe中为边界指定时间戳值?

  •  0
  • Metadata  · 技术社区  · 5 年前

    我试图从sqlserver读取一个表,并在读取时应用分区。在读取数据之前,我想得到lowerBound&上界如下。

    boundsDF = spark.read.format('jdbc')
                    .option('url', 'url')
                    .option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver')
                    .option('user', username)
                    .option('password', password)
                    .option('dbtable', f'(select min(updated_datetime) as mint, max(updated_datetime) as maxt from tablename)
                    .load()
    

    我从boundsDF中提取了如下值:

    maxdate = [x["maxt"] for x in boundsDF.rdd.collect()]
    mindate = [x["mint"] for x in boundsDF.rdd.collect()]
    

    这就是我在阅读时指定时间戳列的方式:

    dataframe = spark.read.format('jdbc')
                     .option('url', url)
                     .option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver')
                     .option('user', user)
                     .option('password', password)
                     .option('dbtable', tablename)
                     .option('partitionColumn', timestamp_column)
                     .option('numPartitions', 3)
                     .option('lowerBound', mindate[0])
                     .option('upperBound', maxdate[0])
                     .option('fetchsize', 5000)
                     .load()
    

    如果我打印mindate&maxdate如下所示:

    mindate[0]: datetime.datetime(2010, 10, 4, 11, 54, 13, 543000)
    maxdate[0]: datetime.datetime(2021, 3, 5, 17, 59, 45, 880000)
    

    当我打印的时候 dataframe.count() ,我看到一条异常消息,如下所示。 例外情况:

    org.apache.spark.SparkException: Job aborted due to stage failure: Task 2 in stage 18.0 failed 1 times, most recent failure: Lost task 2.0 in stage 18.0 (TID 21, executor driver): com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting date and/or time from character string.
    

    自从我开始使用Spark以来,我一直使用整数列作为分区列。这是我第一次使用时间戳列对数据进行分区。

    是mindate[0]&maxdate[0]的格式是否在我的read语句中指定? 有人能告诉我我是否以正确的方式实现了代码吗?

    0 回复  |  直到 5 年前
        1
  •  1
  •   SQLpro    5 年前

    问题是在SQL表中使用什么数据类型?

    1. 时间戳不是日期时间数据类型。它是一个内部行版本号(二进制),与时态数据无关
    2. DATETIME是DATE+TIME的旧的不推荐数据类型,第二个数据类型的小数点限制为3位
    3. DATETIME2取代了datetime,是用于DATE+时间的新数据类型,并且有一个限制,可以选择0到7位小数作为第二位

    现在有两点意见:

    1. 如果使用时间戳,请将其替换为具有所需精度的DATETIME2(默认为7)。
    2. 如果您使用DATETIME,并且不想用DATETIME2替换它,则必须只为第二个的小数部分指定3位数字,但我在代码中看到的是mindate[0]:DATETIME。日期时间(2010、10、4、11、54、13、, 543000 )

    DATETIME2比DATETIME更精确,DATETIME被限制在3毫秒内,这会导致一些查询被错误地解释

    推荐文章