Фильтрация и подсчет отрицательных / положительных значений из фрейма данных Spark с использованием pyspark? - PullRequest
0 голосов
/ 14 сентября 2018

Понятия не имею, как отфильтровать положительные или отрицательные значения в столбце с помощью pyspark. Вы можете помочь?

У меня есть искровой фрейм данных с 10MM + строками и 50+ столбцами, и мне нужно подсчитать, сколько раз значения в одном конкретном столбце равны или меньше 0.

Спасибо заранее.

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Вы можете использовать следующие решения для фильтрации и подсчета отрицательных и положительных значений из фрейма данных Spark с использованием pyspark:

df.filter(col("colname") <= 0).count() //or
df.filter("colname <= 0").count()

Оба должны работать.

0 голосов
/ 27 апреля 2019

Мне пришлось сделать что-то похожее для большой таблицы (более 60 млн записей, более 3000 столбцов), и для подсчета количества столбцов было слишком много времени.Вместо этого я сопоставил каждую строку с 0 или 1;1, если значение было отрицательным, 0 в противном случае.Затем просто суммируйте этот преобразованный Dataframe, и результат представляет счет каждого столбца, в котором значение является отрицательным.

Это образец в scala

import org.apache.spark.sql.catalyst.encoders.RowEncoder
import org.apache.spark.sql._
import org.apache.spark.sql.types._

val df = spark.createDataFrame(
      spark.sparkContext.parallelize(Seq(
        Row(-4.0, 5.0, -2.0), 
        Row(4.0, -5.0, -2.0), 
        Row(-4.0, 5.0, -2.0))),
      StructType(List(
        StructField("col1", DoubleType, true),
        StructField("col2", DoubleType, true),
        StructField("col3", DoubleType, true)
      ))
    )

val columns = df.columns
val transformedSchema = StructType(columns.map(col => StructField(col, LongType)))
val transformedDf = df.map(row => {
      val transformed = columns.map(col => 
        if (row.getDouble(row.fieldIndex(col)) < 0.0) 1L else 0L)
      Row.fromSeq(transformed)
    })(RowEncoder.apply(transformedSchema))

output:

scala> df.show
+----+----+----+
|col1|col2|col3|
+----+----+----+
|-4.0| 5.0|-2.0|
| 4.0|-5.0|-2.0|
|-4.0| 5.0|-2.0|
+----+----+----+

scala> transformedDf.show
+----+----+----+
|col1|col2|col3|
+----+----+----+
|   1|   0|   1|
|   0|   1|   1|
|   1|   0|   1|
+----+----+----+

scala> transformedDf.groupBy().sum().show()
+---------+---------+---------+                                                 
|sum(col1)|sum(col2)|sum(col3)|
+---------+---------+---------+
|        2|        1|        3|
+---------+---------+---------+
0 голосов
/ 14 сентября 2018

Для столбца, на который вы хотите настроить таргетинг, вы можете просто отфильтровать фрейм данных, когда значение равно <= 0, и подсчитать количество строк, соответствующих критериям.

import pyspark.sql.functions as func

df.filter(func.col("colname") <= 0).count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...