Sql server 如何为pyspark dataframe中的边界指定时间戳值?
我试图从sqlserver读取一个表,并在读取时应用分区。在读取数据之前,我想得到lowerBound和upperBound的界限,如下所示Sql server 如何为pyspark dataframe中的边界指定时间戳值?,sql-server,apache-spark,pyspark,apache-spark-sql,Sql Server,Apache Spark,Pyspark,Apache Spark Sql,我试图从sqlserver读取一个表,并在读取时应用分区。在读取数据之前,我想得到lowerBound和upperBound的界限,如下所示 boundsDF = spark.read.format('jdbc') .option('url', 'url') .option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver') .optio
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语句中指定?
有人能告诉我我是否以正确的方式实现了代码吗?问题是在SQL表中使用什么数据类型
DATETIME2比DATETIME更精确,DATETIME限制为3毫秒,这会导致某些查询的解释错误您必须使用SQL Server理解的格式将参数作为字符串传递,但我看到一条错误消息,该消息说无法理解在边界中传递的格式。所以我想我可以这样试试。看看->但是这种语法在Oracle中。我正在使用SqlServer。我理解您的解释。但是,当我给datatime值设为界限时,我面临的是我在问题中提到的一个例外。正如我所说的,如果您使用DATETIME并且不想用DATETIME2替换它,那么您必须只为第二个小数部分指定3位数字,所以修改此代码:mindate[0]:DATETIME.DATETIME(2010,10,4,11,54,13,543000),如果您使用DATETIME,并且不想将其替换为DATETIME.DATETIME(2010、10、4、11、54、13、543),则默认情况下,Spark会以DATETIME.DATETIME的格式读取答案的第2点。您建议我将Datetime的现有格式更改为Datetime2。如果我必须将其转换为Datetime2,那么在Spark读取数据时,我还应该将整个列转换为Datetime2,因为我以该特定格式给出分区边界。我的理解正确吗?我想是的,但你必须试一试