2016-03-17 5 views
0

Я новый Спарк и у меня есть несколько вопросов о функции агрегации MAX и MIN в SparkSQLМакс и Мин Спарк

В SparkSQL, когда я использую функцию MAX/MIN только MAX(value)/MIN(value) возвращается. Но как насчет того, нужна ли мне другая соответствующая колонка?

См., Например, Учитывая данные с колонками time, value и label, как я могу получить time с MIN(Value) сгруппированы по label?

Спасибо.

+0

вы знаете, как это сделать в обычном SQL? обычно вы делаете что-то вроде 'ORDER BY value desc LIMIT 1' – maxymoo

+0

@maxymoo Спасибо. Это связано с группировкой, поэтому я предпочитаю использовать функцию агрегации. – Jamin

+0

@libenn после вашего редактирования, на самом деле путь maxymoo может быть самым простым. То, что вы хотите сделать, не будет работать, так как вы используете функцию агрегации, все результаты должны быть результатом функции агрегации или столбцами, по которым вы группируете (пометьте в своем случае). –

ответ

-1

Вы можете использовать sortByKey (true) для сортировки по возрастанию, а затем применить действие «take (1)», чтобы получить Max.

И использовать sortByKey (ложь) для сортировки по убыванию, а затем применить действие «принять (1)», чтобы получить Min

Если вы хотите использовать свечу-SQL образом, вы можете следить за подход объясняется @ maxymoo

1

Вам нужно сделать сначала сделать groupBy, а затем join, что относится к оригиналу DataFrame. В Scala, это выглядит следующим образом:

df.join(
    df.groupBy($"label").agg(min($"value") as "min_value").withColumnRenamed("label", "min_label"), 
    $"min_label" === $"label" && $"min_value" === $"value" 
).drop("min_label").drop("min_value").show 

Я не использую Python, но это будет выглядеть близко к вышесказанному.

Вы можете даже сделать max() и min() за один проход:

df.join(
    df.groupBy($"label") 
    .agg(min($"value") as "min_value", max($"value") as "max_value") 
    .withColumnRenamed("label", "r_label"), 
    $"r_label" === $"label" && ($"min_value" === $"value" || $"max_value" === $"value") 
).drop("r_label") 
+0

это не вернет столбец 'time', и это то, что хочет OP –

+0

Неправильный вопрос. Оставайтесь на линии. –

+0

Отредактировал свой ответ на самом деле, вы знаете, ответьте на вопрос. :) –

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