在filter()中进行类型转换更快,还是在Spark中先用Column()进行new类型转换,然后再进行filter?

niwlg2el  于 2023-06-30  发布在  Apache
关注(0)|答案(1)|浏览(125)

很直接。是不是跑起来更快

df.filter(col("date_col").cast("timestamp") >= lit(my_timestamp) )

df.withColumn("date_col_cast_timestamp", col("date_col").cast("timestamp") ) \
  .filter("date_col_cast_timestamp" >= lit(my_timestamp) )

或者再来一次

df.withColumn("date_col_cast_timestamp", col("date_col").cast("timestamp") ) \
  .withColumn("my_timestamp", lit(my_timestamp)) \
  .filter("date_col_cast_timestamp" >= col("my_timestamp"))

如果你能解释一下原因,我将不胜感激。我对spark的理解不是最好的,当我尝试做一个过滤器(cast >= lit)时,我注意到创建了数千个任务,而不是几百个。不知道这是更好还是更糟。我不知道它是慢了还是快了。

iszxjhcz

iszxjhcz1#

比较不同解决方案的最佳方法是使用explain函数并比较方案。
就你的情况而言,我认为第一种解决办法比较好

df.filter(col("date_col").cast("timestamp") >= lit(my_timestamp) )

在其他解决方案中,您使用的是创建一个全新列的withColumn,而在第一个解决方案中并非如此。
如果您希望将来多次使用date和timestamps列,则可以接受此解决方案。

相关问题