【发布时间】:2020-02-13 16:14:43
【问题描述】:
我在 spark 1.6 中有一个数据框,我想选择所有大于当前时间的行。我正在使用这种格式“yyyy-MM-dd'T'HH:mm:ss.SSS”过滤“time_occurred”列。我想知道实现这一目标的最佳方法是什么?
【问题讨论】:
标签: scala dataframe apache-spark hadoop apache-spark-sql
我在 spark 1.6 中有一个数据框,我想选择所有大于当前时间的行。我正在使用这种格式“yyyy-MM-dd'T'HH:mm:ss.SSS”过滤“time_occurred”列。我想知道实现这一目标的最佳方法是什么?
【问题讨论】:
标签: scala dataframe apache-spark hadoop apache-spark-sql
最好的方法是将字段转换为 timestamp 类型,使用 Regexp_replace 函数替换 'T'。
然后通过current_timestamp函数我们可以过滤掉dataframe中的数据。
Example:
Spark-scala-1.6:
import sqlContext.implicits._
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
//sample data
val df=sc.parallelize(Seq(("2019-10-17'T'18:30:45.123"),("2019-10-15'T'18:30:45.123"))).toDF("ts")
df.filter(regexp_replace('ts,"'T'"," ").cast("timestamp") > current_timestamp).show(false)
Result:
+-------------------------+
|ts |
+-------------------------+
|2019-10-17'T'18:30:45.123|
+-------------------------+
如果您需要替换 'T' 来获取 ts 字段的时间戳类型,请使用此方法。
df.withColumn("ts",regexp_replace('ts,"'T'"," ").cast("timestamp"))
.filter('ts > current_timestamp).show(false)
Result:
+-----------------------+
|ts |
+-----------------------+
|2019-10-17 18:30:45.123|
+-----------------------+
结果ts 字段将具有Timestamp 类型。
【讨论】: