2017-11-03 17 views
1

この問題を解決する良い方法はありますか?特定のグループの以前に選択したレコードの少なくとも6か月前のレコードを選択したいとします。Hive/Scalaで相対日付を使用してレコードを選択

e。私は:

Col A Col B Date 
1  A  2015-01-01 00:00:00 
1  A  2014-10-01 00:00:00 
1  A  2014-05-01 00:00:00 
1  A  2014-01-01 00:00:00 
1  B  2014-01-01 00:00:00 
2  A  2015-01-01 00:00:00 
2  A  2014-10-01 00:00:00 
2  A  2014-01-01 00:00:00 
2  A  2013-10-01 00:00:00 

私は以前に選択したものと少なくとも6ヶ月離れている日付のみを選択したいと思います。すなわち、それは戻ります:

Col A Col B Date 
1  A  2015-01-01 00:00:00 
1  A  2014-05-01 00:00:00 
1  B  2014-01-01 00:00:00 
2  A  2015-01-01 00:00:00 
2  A  2014-01-01 00:00:00 

あなたが最新のものに比べて選択したい場合は、この使用した順序付けを行う方法私には明らかである

(すなわち:

SELECT b.date, b..., a.latest_date 
FROM(
SELECT *, row_number OVER PARTITION BY Col A, Col B ORDER BY Date as row_number 
FROM table1) temp 
WHERE row_number = 1) a 
INNER JOIN TABLE 1 b 
ON KEY) 
WHERE datediff(date, latestdate)/365 > 0.5 

かそこら

しかし、私はあなたがお互いにどのようにこれを行うだろうか少し不明です。ハイブ/スカラか何かでこれを再帰的に行う方法はありますか?

答えて

0

こんにちは、ウィンドウの遅れとコンセプトのコンセプトはハイブとスパークの両方であり、両方でこの作業を達成することができます。ここにスパークのコードがあります。

val data = sc.parallelize(List(("1",  "A",  "2015-01-01 00:00:00"), 
    |  | ("1",  "A",  "2014-10-01 00:00:00"), 
    |  | ("1",  "A",  "2014-01-01 00:00:00"), 
    |  | ("1",  "B",  "2014-01-01 00:00:00"), 
    |  | ("2",  "A",  "2015-01-01 00:00:00"), 
    |  | ("2",  "A",  "2014-10-01 00:00:00"), 
    |  | ("2",  "A",  "2014-01-01 00:00:00"), 
    |  | ("2",  "A",  "2013-10-01 00:00:00") 
    |  |)).toDF("id","status","Date"); 


    val data2 =data.select($"id",$"status",to_date($"Date").alias(date)); 


import org.apache.spark.sql.expressions.Window 


import org.apache.spark.sql.functions._ 

val wSpec3 = Window.partitionBy("id","status").orderBy(desc("date")); 

val data3 = data2.withColumn("diff",datediff(lag(data2("date"), 1).over(wSpec3),$"date")).filter($"diff">182.5 || $"diff".isNull); 

data3.show 
+---+------+----------+----+ 
| id|status|  date|diff| 
+---+------+----------+----+ 
| 1|  A|2015-01-01|null| 
| 1|  A|2014-01-01| 273| 
| 1|  B|2014-01-01|null| 
| 2|  A|2015-01-01|null| 
| 2|  A|2014-01-01| 273| 
+---+------+----------+----+ 
+0

これは正しくありません。もし6ヶ月未満の3つの日付が(互いに対して)離れているが、中間の日付が無効であれば、最後の日付は有効である可能性があります。 を考えてみましょう:2015年10月1日 2015年6月1日 2015年3月1日 最後のものが有効ですが、この機能では無効になりますです。 – user48944

+0

それに応じて質問を編集してください。 – Achyuth

関連する問題