spark javaDataframe日期过滤器基于另一个Dataframe的最大日期

aemubtdh  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(372)

我有两个Dataframe
一个Dataframe中日期列的最大值::一列,一行-df1,列:maxdate
具有日期列::df2列的多个记录:col1、col2、col3..coldate
我要基于df1.maxdate的过滤器df2, df2.colDate > df1.maxdate 如果我指定如下,那么它的工作。

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

但是,我不能使用df1.maxdate。我正试图用java来实现这个解决方案。
datatype在两个dataframe列中都是date
我正试图通过Spark转换来实现这一点

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

在我的例子中

Table a = df2
Table b = df1
nxagd54h

nxagd54h1#

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

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|
+----------+----+----+

* /
ybzsozfc

ybzsozfc2#

createTempViewtwo dataframes 然后使用sql查询,我们可以过滤出唯一需要的日期。
Example: Option1: using 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|
//+----------+----+----+
``` Option-2:Using dataframe variable: 另一种方法是存储到变量中,然后使用变量,然后在Dataframe中使用变量 filter .

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

df2.filter(col("colDate") > max_val).show()
//+----------+----+----+
//|   colDate|col1|col2|
//+----------+----+----+
//|2020-01-03|   C|   D|
//+----------+----+----+
``` `Option-3:Using dataframe crossJoin and expr:` 在这种情况下,我们不创建变量,而是使用dataframe列来只过滤所需的行。

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

相关问题