apache-spark - 数据字段类型时间戳的不同 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
解决方案
我没有经过测试,所以不能 100% 确定,但这可能是因为它试图将其用作字符串,而不是时间戳 - 至少我已经看到将过滤器推向下游的这种行为。你可以试试这样的东西:
data.filter("ts >= cast('2019-03-10T14:41:34.373+0000' as timestamp)")
推荐阅读
- python - Python中的正则表达式:无法匹配重复的组号
- c# - Asp.Net Core PageStart.cshtml 替代方案?
- javascript - “HTMLElement”类型上不存在属性“值”
- python - 为什么不显示 ValueError
- php - 为什么在没有点击 ajax 提交/验证功能的情况下进行提交
- google-app-engine - 从 Cloud Tasks 启动时,Node App Engine 任务已超过截止日期
- c++ - 为类提供模板如何解决无效的 constexpr 依赖项?C++
- reactjs - React JS:HOC(重组)或 Redux
- php - Laravel Passport - 你如何禁止用户生成客户端?
- r - 如何在 cloudera 集群中创建 R 脚本启动器