Scala - как взять образец (выборку) списка внутри RDD? [Дубликат]

Для тех, кто не хочет использовать внешние почтовые программы и хочет отправлять почту () на выделенный Linux-сервер.

Способ, как php-сообщения, описаны в php.ini в разделе [mail function] , Параметр sendmail-path описывает, как вызывается sendmail. Значение по умолчанию - sendmail -t -i, поэтому, если вы заработаете sendmail -t -i < message.txt в консоли linux, вы сделаете это. Вы также можете добавить mail.log для отладки и убедиться, что почта действительно вызвана.

Различные MTA могут реализовать sendmail, они просто делают символическую ссылку на свои двоичные файлы на это имя. Например, в debian default используется postfix. Настройте свой MTA для отправки почты и протестируйте ее с консоли с помощью sendmail -v -t -i < message.txt. Файл message.txt должен содержать все заголовки сообщения и тело, адресаты назначения для конверта будут взяты из заголовка To:. Пример:

From: myapp@example.com
To: mymail@example.com
Subject: Test mail via sendmail.

Text body.

Я предпочитаю использовать ssmtp как MTA, потому что он прост и не требует запуска демона с открытыми портами. ssmtp подходит только для отправки почты с локального хоста, он также может отправлять аутентифицированную электронную почту через вашу учетную запись в общедоступной почтовой службе. Установите ssmtp и отредактируйте конфигурацию /etc/ssmtp/ssmtp.conf. Чтобы иметь возможность также получать локальную системную почту для учетных записей unix (например, оповещения для root из заданий cron), настройте файл /etc/ssmtp/revaliases.

Вот моя конфигурация для моей учетной записи в почте Yandex:

root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password
18
задан zero323 11 March 2016 в 21:59
поделиться

2 ответа

Одно из возможных решений в ответе Холдена, и вот некоторые другие решения:

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

Вы можете использовать преобразование sampleByKeyExact из PairRDDFunctions .

sampleByKeyExact (boolean withReplacement, scala.collection.Map фракции, длинные семплы) Возвращает подмножество этого RDD, взятого с помощью ключа (через стратифицированную выборку), содержащего точно math.ceil (numItems * samplingRate) для каждой страты (группа пар с одним и тем же ключом).

И так я буду делать:

Учитывая следующий список:

val seq = Seq(
                (2147481832,23355149,1),(2147481832,973010692,1),(2147481832,2134870842,1),(2147481832,541023347,1),
                (2147481832,1682206630,1),(2147481832,1138211459,1),(2147481832,852202566,1),(2147481832,201375938,1),
                (2147481832,486538879,1),(2147481832,919187908,1),(214748183,919187908,1),(214748183,91187908,1)
           )

Я создал пару RDD, отображая всех пользователей как клавиши:

val data = sc.parallelize(seq).map(x => (x._1,(x._2,x._3)))

Затем я настрою fractions для каждой клавиши следующим образом, поскольку sampleByKeyExact принимает карту дробей для каждой клавиши:

val fractions = data.map(_._1).distinct.map(x => (x,0.8)).collectAsMap

То, что я здесь сделал, - это сопоставление ключей для поиска разных ключей, а затем сопоставление каждой части с долей равно 0.8. Я собираю все как карту.

Образец сейчас:

import org.apache.spark.rdd.PairRDDFunctions
val sampleData = data.sampleByKeyExact(false, fractions, 2L)

или

val sampleData = data.sampleByKeyExact(withReplacement = false, fractions = fractions,seed = 2L)

Вы можете проверить количество на ваших ключах или данных или образец данных:

scala > data.count
// [...]
// res10: Long = 12

scala > sampleData.count
// [...]
// res11: Long = 10

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

Рассмотрим те же данные (seq) из предыдущего раздела.

val df = seq.toDF("keyColumn","value1","value2")
df.show
// +----------+----------+------+
// | keyColumn|    value1|value2|
// +----------+----------+------+
// |2147481832|  23355149|     1|
// |2147481832| 973010692|     1|
// |2147481832|2134870842|     1|
// |2147481832| 541023347|     1|
// |2147481832|1682206630|     1|
// |2147481832|1138211459|     1|
// |2147481832| 852202566|     1|
// |2147481832| 201375938|     1|
// |2147481832| 486538879|     1|
// |2147481832| 919187908|     1|
// | 214748183| 919187908|     1|
// | 214748183|  91187908|     1|
// +----------+----------+------+

Мы вам понадобится базовый RDD, чтобы сделать это, на котором мы создаем кортежи элементов в этом RDD, определяя наш ключ как первый столбец:

val data: RDD[(Int, Row)] = df.rdd.keyBy(_.getInt(0))
val fractions: Map[Int, Double] = data.map(_._1)
                                      .distinct
                                      .map(x => (x, 0.8))
                                      .collectAsMap

val sampleData: RDD[Row] = data.sampleByKeyExact(withReplacement = false, fractions, 2L)
                               .values

val sampleDataDF: DataFrame = spark.createDataFrame(sampleData, df.schema) // you can use sqlContext.createDataFrame(...) instead for spark 1.6)

Теперь вы можете проверить количество ваши ключи или df или образец данных:

scala > df.count
// [...]
// res9: Long = 12

scala > sampleDataDF.count
// [...]
// res10: Long = 10

Начиная с Spark 1.5.0 вы можете использовать метод DataFrameStatFunctions.sampleBy:

df.stat.sampleBy("keyColumn", fractions, seed)
21
ответ дан eliasah 20 August 2018 в 20:35
поделиться
  • 1
    Это здорово, я могу сделать вычитание, чтобы получить 20%? или вы рекомендуете лучшее решение? – Null-Hypothesis 2 September 2015 в 15:21
  • 2
    ну, как только у вас появится новый rdd, вы можете с ним что-то сделать. – eliasah 2 September 2015 в 15:22
  • 3
    Я вижу, что метод образца доступен на rdd, но не sampleByKeyExact – Null-Hypothesis 2 September 2015 в 15:39
  • 4
    какую версию искры вы используете? это фактически PairRDDFunctions – eliasah 2 September 2015 в 15:43
  • 5
    "org.apache.spark" %% "spark-core" % "1.4.1", "org.apache.spark" %% "spark-mllib" % "1.4.1" – Null-Hypothesis 2 September 2015 в 15:46

Что-то вроде этого может быть хорошо подходит для чего-то вроде «Blink DB», но давайте рассмотрим вопрос. Существует два способа интерпретировать то, что вы просили:

1) Вы хотите 80% ваших пользователей, и вы хотите, чтобы все данные были для них. 2) Вы хотите 80% данных каждого пользователя

. Для # 1 вы можете сделать карту, чтобы получить идентификаторы пользователя, вызывать разные, а затем опробовать 80% из них (вы можете посмотреть kFold в MLUtils или BernoulliCellSampler). Затем вы можете отфильтровать свои входные данные только для набора идентификаторов, которые вы хотите.

Для # 2 вы можете посмотреть BernoulliCellSampler и просто применить его напрямую.

2
ответ дан Holden 20 August 2018 в 20:35
поделиться
Другие вопросы по тегам:

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