【发布时间】:2019-01-15 15:01:38
【问题描述】:
我正在尝试使用 Scala 和 Spark 过滤比较两个日期列的 DataFrame。基于过滤后的 DataFrame,在顶部运行计算以计算新列。 简化后我的数据框具有以下架构:
|-- received_day: date (nullable = true)
|-- finished: int (nullable = true)
除此之外,我还创建了两个新列 t_start 和 t_end,用于过滤 DataFrame。它们与原始列 received_day 相差 10 天和 20 天:
val dfWithDates= df
.withColumn("t_end",date_sub(col("received_day"),10))
.withColumn("t_start",date_sub(col("received_day"),20))
我现在想要一个新的计算列,它为每一行数据指示在t_start 到t_end 期间有多少行数据帧。我想我可以通过以下方式实现:
val dfWithCount = dfWithDates
.withColumn("cnt", lit(
dfWithDates.filter(
$"received_day".lt(col("t_end"))
&& $"received_day".gt(col("t_start"))).count()))
但是,这个计数只返回 0,我相信问题出在我传递给 lt 和 gt 的参数上。
从这里Filtering a spark dataframe based on date 关注该问题,我意识到我需要传递一个字符串值。如果我尝试使用像lt(lit("2018-12-15")) 这样的硬编码值,那么过滤就会起作用。所以我试着把我的专栏投到StringType:
val dfWithDates= df
.withColumn("t_end",date_sub(col("received_day"),10).cast(DataTypes.StringType))
.withColumn("t_start",date_sub(col("received_day"),20).cast(DataTypes.StringType))
但过滤器仍然返回一个空的数据帧。 我会假设我没有正确处理数据类型。
我在带有 Spark 2.0.2 的 Scala 2.11.0 上运行。
【问题讨论】:
-
也许还有人知道我在哪里可以找到关于
lt()和gt()的文档?我试着搜索它,但找不到我要找的东西。 -
您可以在
Column数据类型上找到所有可操作的函数:spark.apache.org/docs/latest/api/scala/…
标签: scala apache-spark apache-spark-sql