2017-05-09 11 views
0

私は、以下に述べるように火花の中に2つのデータフレームを持っています。火花の日付列に基づいて2つのデータフレームとフィルタ結果を比較

test1のは、ID、名前、年齢などの列があり
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"); 

、私はどこaudit_dt> test_dt test1のからこれら2つのデータフレームやフィルター行を比較したいaudit_dt

。どういうわけか私はそれをすることができません。 lit_functionを使用してaudit_dtとリテラル日付を比較できますが、別のデータフレーム列と比較することはできません。テストデータフレーム内

下に述べたように、私は点灯機能を使用してリテラルの日付を比較することができる午前
val output = test1.filter(to_date(test1("audit_date")).gt(lit("2017-03-23"))) 

マックス日がある - TEST1のデータフレーム内> 2017年4月26日

データ - >

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

誰もがデータフレームテストの列と比較する方法として提案できますか?

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

ストアフィルター内の変数と使用価値:

おかげ

+0

例のデータと予想される出力を共有してください。 – mtoto

+0

@mtoto質問 –

答えて

1

あなたは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") 
+0

あなたの解決策は私によく見えます。私はそれを試みます。しかし、私の両方の日付列はStringクラスです。あなたが言ったクエリでto_dateを使ってキャストして比較することができます。 –

+0

キャストステップの編集を参照 – mtoto

1

はこれで試してみてください。

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

test_dtは別のデータフレームの列であるため、これもうまく動作しませんでした。私もこれを試しました。 –

関連する問題