根据spark

时间:2017-05-09 08:20:10

标签: scala apache-spark apache-spark-sql

我在spark中有2个数据帧,如下所述。

val test = hivecontext.sql("select max(test_dt) as test_dt from abc");

test: org.apache.spark.sql.DataFrame = [test_dt: string]

val test1 = hivecontext.table("testing");

其中test1包含id,name,age,audit_dt

等列

我想比较来自test1的这两个数据帧和过滤行,其中audit_dt> test_dt。不知何故,我无法做到这一点。我可以使用lit函数将audit_dt与文字日期进行比较,但我无法将其与另一个数据帧列进行比较。

我能够使用点亮功能比较文字日期,如下所述

val output = test1.filter(to_date(test1("audit_date")).gt(lit("2017-03-23")))

测试数据框中的最大日期是 - > 2017年4月26日

test1 Dataframe中的数据 - >

Id,Name,Age,Audit_Dt
1,Rahul,23,2017-04-26
2,Ankit,25,2017-04-26
3,Pradeep,28,2017-04-27

我只需要Id = 3的数据,因为只有行符合大于最大日期的条件。

我已经尝试了下面提到的选项,但它无效。

val test = hivecontext.sql("select max(test_dt) as test_dt from abc")
val MAX_AUDIT_DT = test.first().toString()
val output = test.filter(to_date(test("audit_date")).gt((lit(MAX_AUDIT_DT))))

有人建议将其与数据帧测试列进行比较吗?

由于

2 个答案:

答案 0 :(得分:2)

如果non-equi"test_dt"列都属于"audit_date"类,您可以使用date个联接。

/// cast to correct type
import org.apache.spark.sql.functions.to_date
val new_test = test.withColumn("test_dt",to_date($"test_dt"))
val new_test1 = test1.withColumn("Audit_Dt", to_date($"Audit_Dt"))

/// join
new_test1.join(new_test, $"Audit_Dt" > $"test_dt")
         .drop("test_dt").show()
+---+-------+---+----------+
| Id|   Name|Age|  Audit_Dt|
+---+-------+---+----------+
|  3|Pradeep| 28|2017-04-27|
+---+-------+---+----------+

数据

val test1 = sc.parallelize(Seq((1,"Rahul",23,"2017-04-26"),(2,"Ankit",25,"2017-04-26"),
             (3,"Pradeep",28,"2017-04-27"))).toDF("Id","Name", "Age", "Audit_Dt")
val test = sc.parallelize(Seq(("2017-04-26"))).toDF("test_dt")

答案 1 :(得分:1)

试试这个:

test1.filter(to_date(test1("audit_date")).gt(to_date(test("test_dt"))))

将值存储在变量中并在过滤器中使用。

val dtValue = test.select("test_dt") 

OR

val dtValue = test.first().getString(0)

现在应用过滤器

val output = test1.filter(to_date(test1("audit_date")).gt(lit(dtValue)))