Мне пришлось сделать что-то похожее для большой таблицы (более 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|
+---------+---------+---------+