Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何为pyspark dataframe中的边界指定时间戳值?_Sql Server_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

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

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

我试图从sqlserver读取一个表,并在读取时应用分区。在读取数据之前,我想得到lowerBound和upperBound的界限,如下所示

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表中使用什么数据类型

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

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

  • 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,因为我以该特定格式给出分区边界。我的理解正确吗?我想是的,但你必须试一试