当我在Spark-SQL的时间戳字段中使用'T'分隔符时为什么会得到不同的计数结果
仅供参考::使用dse spark使用cassandra表中的数据
Datastax版本:DSE 5.1.3
Apache Cassandra™3.11.0.1855 *
Apache Spark™2.0.2.6
DataStax Spark Cassandra连接器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
另外,如果我与spark-sql相比使用cassandraCount(),则会得到不同的结果
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
答案 0 :(得分:0)
我没有经过测试,所以不能100%确定,但这可能是因为它试图将其用作字符串,而不是用作时间戳记-至少我已经看到了向下游推送过滤器的这种行为。您可以尝试以下方法吗?
data.filter("ts >= cast('2019-03-10T14:41:34.373+0000' as timestamp)")
答案 1 :(得分:0)
这是TimeZone的问题,Spark使用本地TimeZone,尝试将您的Spark conf设置为UTC
TimeZone.setDefault(TimeZone.getTimeZone("UTC"))