我在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))))
有人建议将其与数据帧测试列进行比较吗?
由于
答案 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)))