Как исправить count () быстрее для огромных кадров данных? [Дубликат]

Все объекты гарантированно имеют метод .equals(), поскольку Object содержит метод, .equals(), который возвращает логическое значение. Задача подкласса переопределять этот метод, если требуется дополнительное определение определения. Без него (т. Е. С помощью ==) только адреса памяти проверяются между двумя объектами для равенства. String переопределяет этот метод .equals() и вместо использования адреса памяти возвращает сравнение строк на уровне символа для равенства.

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

6
задан Ash Berlin-Taylor 5 January 2018 в 17:06
поделиться

1 ответ

Здесь нет фильтра. И col("is_fav") == 1, и col("is_fav") == 0) являются просто булевыми выражениями, а count действительно не заботятся об их значении до тех пор, пока оно определено.

Существует множество способов решить эту проблему, например, используя simple sum:

from pyspark.sql.functions import sum, abs

gpd = df.groupBy("f")
gpd.agg(
    sum("is_fav").alias("fv"),
    (count("is_fav") - sum("is_fav")).alias("nfv")
)

или сделать игнорированные значения неопределенными (aka NULL ):

exprs = [
    count(when(col("is_fav") == x, True)).alias(c)
    for (x, c) in [(1, "fv"), (0, "nfv")]
]
gpd.agg(*exprs)
11
ответ дан zero323 15 August 2018 в 23:43
поделиться
  • 1
    Я получаю TypeError: неподдерживаемый тип операндов для +: 'int' и 'str' в первом решении, в сумме. Я уверен, что столбец is_fav содержит IntegerType, поэтому я не понимаю? – mar tin 18 March 2016 в 09:20
  • 2
    Отсутствует импорт или некоторые конфликты с функцией sum? Я имею в виду, что вы используете встроенный sum не functions.sum. – zero323 18 March 2016 в 09:27
  • 3
    Да, это так, отсутствие импорта. Я предполагаю, что это путало со встроенным Python & quot; sum & quot ;. – mar tin 18 March 2016 в 12:22
Другие вопросы по тегам:

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