спарк как уменьшить по столбцу типа данных это дата - PullRequest
0 голосов
/ 13 ноября 2018

Я работаю с DataFrame выглядит следующим образом:

-------------------------------
| time                | value | 
-------------------------------
| 2014-12-01 02:54:00 |    2  |
| 2014-12-01 03:54:00 |    3  |
| 2014-12-01 04:54:00 |    4  |
| 2014-12-01 05:54:00 |    5  |
| 2014-12-02 02:54:00 |    6  |
| 2014-12-02 02:54:00 |    7  |
| 2014-12-03 02:54:00 |    8  |
-------------------------------

количество выборок в каждый день довольно случайное.

Я хочу получать только одну выборку в день,например:

-------------------------------
| time                | value | 
-------------------------------
| 2014-12-01 02:54:00 |    2  |
| 2014-12-02 02:54:00 |    6  |
| 2014-12-03 02:54:00 |    8  |
-------------------------------

Мне все равно, какой образец я получу за один день, но я хочу убедиться, что он получен, чтобы в столбце "время" не было дублирования дня.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы можете использовать оконные функции, генерировать row_number путем разбиения по значению даты и фильтровать по row_number = 1

Проверьте это:

val df = Seq(("2014-12-01 02:54:00","2"),("2014-12-01 03:54:00","3"),("2014-12-01 04:54:00","4"),("2014-12-01 05:54:00","5"),("2014-12-02 02:54:00","6"),("2014-12-02 02:54:00","7"),("2014-12-03 02:54:00","8"))
  .toDF("time","value")
df.withColumn("time",'time.cast("timestamp")).withColumn("value",'value.cast("int"))
df.createOrReplaceTempView("timetab")
spark.sql(
  """ with order_ts( select time, value , row_number() over(partition by date_format(time,"yyyyMMdd") order by value ) as rn from timetab)
    select time,value from order_ts where rn=1
  """).show(false)

Вывод:

+-------------------+-----+
|time               |value|
+-------------------+-----+
|2014-12-02 02:54:00|6    |
|2014-12-01 02:54:00|2    |
|2014-12-03 02:54:00|8    |
+-------------------+-----+
0 голосов
/ 13 ноября 2018

Вы можете сначала создать столбец даты, а затем dropDuplicates на основе столбца date; Пример с pyspark, синтаксис должен быть похожим, если вы используете scala или java:

import pyspark.sql.functions as f
df.withColumn('date', f.to_date('time', 'yyyy-MM-dd HH:mm:ss')) \
  .dropDuplicates(['date']).drop('date').show()
+-------------------+-----+
|               time|value|
+-------------------+-----+
|2014-12-02 02:54:00|    6|
|2014-12-03 02:54:00|    8|
|2014-12-01 02:54:00|    2|
+-------------------+-----+
...