Spark:比较日期的计算有效方法?

sha*_*dzy 2 performance scala apache-spark apache-spark-sql spark-dataframe

我有一个庞大的数据集,需要按日期过滤(日期存储为 yyyy-MM-dd 格式)。以下哪个选项是最有效的计算方式(以及为什么)?

df.filter("unix_timestamp(dt_column,'yyyy-MM-dd') >= unix_timestamp('2017-02-03','yyyy-MM-dd')")

或者

df.filter("cast(dt_column as date) >= cast('2017-02-03' as date)")

mrs*_*vas 7

因为dt_column已经yyyy-MM-dd不需要cast/unix_timestamp它了。在内部,spark 仅对所有日期类型(从 Spark 2.1 开始)与字符串进行字典比较date比较时不会有任何低级别的类型。

现在cast('2017-02-03' as date)并且unix_timestamp('2017-02-03','yyyy-MM-dd')可能不会导致性能问题,因为它是恒定的。我建议您在编译时使用 DataSet 函数来捕获语法问题

//These two should be the same
df.filter(df("dt_column") >= lit("2017-02-03"))

df.filter(df("dt_column") >= lit("2017-02-03").cast(DataTypes.DateType))
Run Code Online (Sandbox Code Playgroud)

cast并且unix_timestamp两者都从字符串生成日期,但 unix_timestamp提供了以差异格式创建日期的选项。除此之外,在性能方面不应该有任何差异

  • 对于 Spark 3.0+ ,这已经改变了。`从 Spark 3.0 开始,Spark 将在与日期/时间戳进行二进制比较时将 String 转换为 Date/TimeStamp。通过将 Spark.sql.legacy.typeCoercion.datetimeToString 设置为 true 可以恢复之前将日期/时间戳转换为字符串的行为。 (2认同)