当前位置: 首页 > 知识库问答 >
问题:

基于max Date的Spark java DataFrame Date过滤器另一个DataFrame

孟乐
2023-03-14

我有两个数据框

> < li>

一个数据帧中的最大日期列::一列,一行- df1,列:最大日期

具有日期列:: df2列的多条记录:col1, col2, col3… colDate

我想要过滤器 df2 基于 df1.maxdate, df2.colDate

如果我指定如下,那么它的工作。

df2.filter(col("colDate").gt(lit(2020-01-01)))

然而,我不能使用df1.maxdate。我正在尝试用java来实现这个解决方案

DataType是两个数据帧列中的日期

我试图通过火花转换来实现这一点

select * from a 
where a.col > (select max(b.col) from b)

在我的例子中

Table a = df2
Table b = df1

共有2个答案

胡志
2023-03-14

createTempView上的两个数据框然后使用sql查询我们可以过滤唯一需要的日期。

示例:

选项 1:使用 createTempView:

df1.show()
//+----------+
//|   Maxdate|
//+----------+
//|2020-01-01|
//+----------+

df2.show()
//+----------+----+----+
//|   colDate|col1|col2|
//+----------+----+----+
//|2020-01-01|   A|   B|
//|2020-01-03|   C|   D|
//+----------+----+----+


df1.createOrReplaceTempView("tmp")

df2.createOrReplaceTempView("tmp1")

sql("select * from tmp1 where coldate > (select maxdate from tmp)").show()
//+----------+----+----+
//|   colDate|col1|col2|
//+----------+----+----+
//|2020-01-03|   C|   D|
//+----------+----+----+

选项2:使用数据框变量:

另一种方法是存储到变量中,然后使用该变量,然后在数据帧筛选器中使用变量。

val max_val=df1.collect()(0)(0).toString

df2.filter(col("colDate") > max_val).show()
//+----------+----+----+
//|   colDate|col1|col2|
//+----------+----+----+
//|2020-01-03|   C|   D|
//+----------+----+----+

选项 3:使用数据帧交叉联接和 expr:

在这种情况下,我们没有创建变量,而是使用数据帧列来仅过滤所需的行。

df2.crossJoin(df1).
filter(expr("colDate > Maxdate")).
drop("Maxdate").
show()
//+----------+----+----+
//|   colDate|col1|col2|
//+----------+----+----+
//|2020-01-03|   C|   D|
//+----------+----+----+
勾学博
2023-03-14

下面的代码可能对您有帮助,

val df1 = Seq(('2020-01-02')).toDF("Maxate")

df1.show()

/*
+----------+
|    Maxate|
+----------+
|2020-01-02|
+----------+
*/

val df2 = Seq(("2020-01-01","A","B"),("2020-01-03","C","D")).toDF("colDate","col1","col2")

/*
+----------+----+----+
|   colDate|col1|col2|
+----------+----+----+
|2020-01-01|   A|   B|
|2020-01-03|   C|   D|
+----------+----+----+
*/
val maxDate=df1.collect.map(row=>row.getString(0)).mkString

df2.filter($"colDate">maxDate).show()

/*
+----------+----+----+
|   colDate|col1|col2|
+----------+----+----+
|2020-01-03|   C|   D|
+----------+----+----+
*/
 类似资料:
  • 问题内容: 我在此论坛和Google中搜索后发布了查询,但无法解决相同的问题。 我正在尝试根据列表1中的值过滤列表2(多列)。 码 在上面的代码中,如果我提供特定值,则可以过滤,但不确定如何检查列表2中的Car Name是否在列表1中退出。 希望我面对的问题很清楚,等待指导(对于Java来说还是比较新的,因此,如果上述查询非常基础,请原谅)。 编辑, 我相信上面提供的链接3应该可以解决,但就我而言

  • 问题内容: 我有一个过滤器linkifyStuff,其中需要使用其他过滤器处理一些变量。我无法弄清楚从另一个调用一个过滤器的语法。 我了解过滤器链接-这不是我想要的。我想将过滤器应用于linkifyStuff过滤器中的局部变量,而不是其输入或输出。 我希望像下面这样工作,但是$ filter(’filtername’)显然不是正确的语法。 我可以为sanitizeStuff和sanitizeStu

  • 我正在研究一个合作医疗系统。 我的代码在url调用的servlet的

  • Spring boot maven插件正在使用paketo builder构建图像。 我想做的是在这个构建器正在做的事情上添加另一个步骤。我已经创建了自己的构建包,并试图创建包含基本构建包的构建器。 我遇到的第一个问题是,当试图从builder.toml创建一个构建器时,会出现这样的错误: 另一个问题是,即使这样做有效,我想我仍然必须指定来自paketo:base的所有order.group。 是

  • 主要内容:1. 过滤器维度,2. 过滤器度量,4. 日期过滤器过滤是从结果集中删除特定值的过程。Tableau过滤功能允许使用字段值和高级计算或基于上下文的过滤器的简单方案。 在Tableau中,有三种类型的基本过滤器,它们分别如下: 过滤器维度:过滤器维度是应用于维度字段的过滤器。 过滤器度量:过滤度量是应用于度量字段的过滤器。 过滤日期:过滤日期是应用于日期字段的过滤器。 1. 过滤器维度 这些过滤器仅应用于维度字段。下面的示例包括基于数值类别的过滤或逻

  • 我试图建立一个专栏,将根据另一个。新列应反映满足某些标准的值,并在值不符合标准的地方放置0。 例如,名为银行余额的列将有负值和正值;新列透支将为相应行提供负值,余额大于0时为0。 最终结果应该是这样的。