2016-03-17 5 views
0

У меня есть кадр данных, который имеет столбец с секундами секунд.
В дополнение к этому я хотел бы добавить столбец, который содержит разницу между текущим и предыдущим значением времени, другими словами, временную разницу с последней строки в кадре данных на основе столбца временной метки.Создать новый столбец в Spark DataFrame с разницей предыдущих значений из другого столбца

Как бы добавить такой столбец на основе более ранних значений?

Я использую Scala API.

+0

Вы группируете/разделяете данные? – zero323

+0

Не так давно - только что перечислили все строки из журнала и хотите наметить некоторые измерения в зависимости от времени –

+0

Если вы не группируете кадры данных, вы не будете работать для вас (я имею в виду, что вы можете, но вы действительно этого не хотите) , Вместо этого используйте скользящее: http://stackoverflow.com/a/32679114/1560062. Если вы решили сгруппировать, вы можете использовать функции окна, как показано здесь: http://stackoverflow.com/q/34535833/1560062 – zero323

ответ

0

Это сделает то, что вы хотите, хотя, как указано, это может быть немного медленным.

df.printSchema 
root 
|-- ts: long (nullable = false) 

df.join(
    df.toDF("ts2"), 
    $"ts2" < $"ts", 
    "left_outer" 
).groupBy($"ts").agg(max($"ts2") as "prev").select($"ts", $"ts" - $"prev" as "diff").show 

Мы можем даже использовать мою развалюху из DataFrame-ified zipWithIndex, чтобы сделать его лучше. Предположим, что мы использовали это, чтобы добавить id колонку, вы можете сделать:

df.join(
    df.toDF("prev_id", "prev_ts"), 
    $"id" === $"prev_id" + 1, 
    "left_outer" 
).select($"ts", $"ts" - $"prev_ts" as "diff").show 
+0

Немного серьезное преуменьшение :) Для этого требуется полный декартово произведение. – zero323

+0

Я не видел ничего в вопросе о производительности. :) Я имею в виду, я могу получить всевозможные глупости и сделать zipWithIndex - http://stackoverflow.com/questions/30304810/dataframe-ified-zipwithindex - и сделать соединение в столбце индекса с идентификатором '$ ' «=== $« id »- 1' - это лучше? –

+0

Собственно, это __much__ лучше :) _O (N) _ vs _O (N^2) _ лучше, если быть точным. Но если вы попадаете в RDD, нет никаких оснований для возврата к DF :( – zero323

0

Я не знаю, Scala. Но как насчет создания отстающего столбца с lag, а затем вычитания одного столбца из другого?

Смежные вопросы