数据字段类型时间戳的不同 spark-sql 结果
Different spark-sql results for data field type timestamp
当我在 spark-SQL
中为时间戳字段使用 'T' 分隔符时,为什么我得到不同的计数结果
仅供参考: 使用 dse spark 使用来自 cassandra 表的数据
Datastax 版本:DSE 5.1.3
Apache Cassandra™ 3.11.0.1855 *
阿帕奇火花™ 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
此外,如果我使用 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
我没有经过测试,所以不是 100% 确定,但这可能是因为它试图将它用作字符串,而不是时间戳 - 至少我已经看到将过滤器推向下游的这种行为。你能试试这样的东西吗:
data.filter("ts >= cast('2019-03-10T14:41:34.373+0000' as timestamp)")
这是TimeZone的问题,Spark使用本地TimeZone,尝试在你的Spark conf中设置TimeZone为UTC
TimeZone.setDefault(TimeZone.getTimeZone("UTC"))
当我在 spark-SQL
中为时间戳字段使用 'T' 分隔符时,为什么我得到不同的计数结果仅供参考: 使用 dse spark 使用来自 cassandra 表的数据
Datastax 版本:DSE 5.1.3
Apache Cassandra™ 3.11.0.1855 *
阿帕奇火花™ 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
此外,如果我使用 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
我没有经过测试,所以不是 100% 确定,但这可能是因为它试图将它用作字符串,而不是时间戳 - 至少我已经看到将过滤器推向下游的这种行为。你能试试这样的东西吗:
data.filter("ts >= cast('2019-03-10T14:41:34.373+0000' as timestamp)")
这是TimeZone的问题,Spark使用本地TimeZone,尝试在你的Spark conf中设置TimeZone为UTC
TimeZone.setDefault(TimeZone.getTimeZone("UTC"))