首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为pyspark dataframe中的边界指定时间戳值?

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

Stack Overflow用户
提问于 2021-03-05 18:19:12
回答 1查看 295关注 0票数 1

我正在尝试从sqlserver读取表,并在读取时应用分区。在读取数据之前,我希望获得lowerBound和upperBound的界限,如下所示。

代码语言:javascript
复制
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中提取了如下值:

代码语言:javascript
复制
maxdate = [x["maxt"] for x in boundsDF.rdd.collect()]
mindate = [x["mint"] for x in boundsDF.rdd.collect()]

下面是我在读取时指定时间戳列的方式:

代码语言:javascript
复制
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的值,如下所示:

代码语言:javascript
复制
mindate[0]: datetime.datetime(2010, 10, 4, 11, 54, 13, 543000)
maxdate[0]: datetime.datetime(2021, 3, 5, 17, 59, 45, 880000)

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

代码语言:javascript
复制
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以来,我一直使用整数列作为我的分区列。这是我第一次使用时间戳列对数据进行分区。

在我的read语句中,mindate和maxdate的格式是否正确?有人能让我知道我是否以正确的方式实现了代码吗?

EN

回答 1

Stack Overflow用户

发布于 2021-03-08 16:40:14

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

  1. 时间戳不是datetime数据类型。它是内部行版本号(二进制),与时态数据无关
  2. datetime是旧的过时的日期+时间数据类型,并且second
  3. DATETIME2,的小数位数限制为3位,取代了datetime,是用于DATE + TIME的新数据类型,并且第二个

的小数位数限制为0到7

下面是两句话:

  1. 如果您使用时间戳,请将其替换为所需的精度(默认为7)的DATETIME2。
  2. 如果您使用的是DATETIME并且不希望将其替换为DATETIME2,则只需为秒的小数部分指定3位数字,但我在您的代码中看到的是mindate: datetime.datetime(2010,10,4,11,54,13,543000)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66490720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档