首页 > 解决方案 > 数据字段类型时间戳的不同 spark-sql 结果

问题描述

为什么我在 spark-SQL 中对时间戳字段使用“T”分隔符时得到不同的计数结果

仅供参考:使用 dse spark Datastax 版本的 cassandra 表中的数据:DSE 5.1.3
Apache Cassandra™ 3.11.0.1855 *
Apache Spark™ 2.0.2.6
DataStax Spark Cassandra Connector 2.0.5 *

scala> val data = spark.sql("select * from pramod.history ").where(col("sent_date") >= "2024-06-11 00:00:00.000Z" && col("sent_date") <= "2027-11-15 00:00:00.000Z")
data: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [tx_id: string, agreement_number: string ... 37 more fields]

scala> data.count()
res21: Long = 181466

scala> val data = spark.sql("select * from pramod.history ").where(col("sent_date") >= "2024-06-11T00:00:00.000Z" && col("sent_date") <= "2027-11-15T00:00:00.000Z")
data: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [tx_id: string, agreement_number: string ... 37 more fields]

scala> data.count()
res22: Long = 163228

此外,如果我使用 cassandraCount() 与 spark-sql 相比,得到不同的结果

scala> val rdd = sc.cassandraTable("pramod", "history").select("tx_id","sent_date").where("sent_date>='2024-06-11 00:00:00.000Z' and sent_date <='2027-11-15 00:00:00.000Z'")
rdd: com.datastax.spark.connector.rdd.CassandraTableScanRDD[com.datastax.spark.connector.CassandraRow] = CassandraTableScanRDD[77] at RDD at CassandraRDD.scala:19

scala> rdd.count()
res20: Long = 181005

scala> rdd.cassandraCount()
res25: Long = 181005

标签: apache-sparkapache-spark-sqldatastaxdatastax-enterprisespark-cassandra-connector

解决方案


我没有经过测试,所以不能 100% 确定,但这可能是因为它试图将其用作字符串,而不是时间戳 - 至少我已经看到将过滤器推向下游的这种行为。你可以试试这样的东西:

data.filter("ts >= cast('2019-03-10T14:41:34.373+0000' as timestamp)")

推荐阅读