Преобразование ключа / пары RDD для получения суммы значений, минимальных и максимальных значений в каждой группе с использованием Python SPark [duplicate]

Если у вас возникли проблемы с отправкой писем с помощью PHP, рассмотрите альтернативу, например PHPMailer или SwiftMailer .

Обычно я использую SwiftMailer всякий раз, когда мне нужно для отправки писем с PHP.


Основное использование:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('

New message

Here goes the rest of my message

', 'text/html'); if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) { echo json_encode([ "status" => "OK", "message" => 'Your message has been sent!' ], JSON_PRETTY_PRINT); } else { echo json_encode([ "status" => "error", "message" => 'Oops! Something went wrong!' ], JSON_PRETTY_PRINT); }

Подробнее о том, как использовать SwiftMailer, см. в официальной документации .

2
задан zero323 23 February 2016 в 19:52
поделиться

1 ответ

Если вход является DataFrame, просто используйте agg:

import pyspark.sql.functions as sqlf

df = sc.parallelize([
   ("foo", 1.0), ("foo", 2.5), ("bar", -1.0), ("bar", 99.0)
]).toDF(["k", "v"])

df.groupBy("k").agg(sqlf.min("v"), sqlf.max("v"), sqlf.sum("v")).show()

## +---+------+------+------+
## |  k|min(v)|max(v)|sum(v)|
## +---+------+------+------+
## |bar|  -1.0|  99.0|  98.0|
## |foo|   1.0|   2.5|   3.5|
## +---+------+------+------+

С помощью RDD вы можете использовать statcounter:

from pyspark.statcounter import StatCounter

rdd = df.rdd
stats = rdd.aggregateByKey(
    StatCounter(), StatCounter.merge, StatCounter.mergeStats
).mapValues(lambda s: (s.min(), s.max(), s.sum()))

stats.collect()
## [('bar', (-1.0, 99.0, 98.0)), ('foo', (1.0, 2.5, 3.5))]

Используя свои функции, вы можете сделайте что-то вроде этого:

def apply(x, y, funs=[minFunc, maxFunc, sumFunc]):
    return [f(x_, y_) for f, x_, y_ in zip(*(funs, x, y))]

rdd.combineByKey(lambda x: (x, x, x), apply, apply).collect()
## [('bar', [-1.0, 99.0, 98.0]), ('foo', [1.0, 2.5, 3.5])]
1
ответ дан zero323 21 August 2018 в 11:01
поделиться
  • 1
    Можете ли вы также использовать метод RDD для нескольких экземпляров StatCounter? Например, если вы хотите использовать min / max для разных столбцов в одной и той же совокупности? – Matthias 8 July 2016 в 08:04
  • 2
    Я попытался использовать ваш пример StatCounter. Но когда я пытаюсь использовать RDD с ключевыми значениями с строковым-float, то я получаю эту ошибку: TypeError: unbound метод merge () должен быть вызван с экземпляром NoneType в качестве первого аргумента (вместо этого вместо экземпляра StatCounter) – Matthias 18 July 2016 в 13:28
  • 3
    @Matthias Я больше не использую Python 2. Если вы используете 2.x, вам придется использовать функции, которые используют определенные экземпляры, которые вы получаете в seq-op и merge-op. – zero323 18 July 2016 в 14:05
  • 4
    спасибо за подсказку. После поиска в течение нескольких недель, я наконец нашел действительно хорошее объяснение здесь . – Matthias 19 July 2016 в 07:01
Другие вопросы по тегам:

Похожие вопросы: