Фильтрация функции перед группировкой по. Spark ленив, поэтому преобразование (фильтр, группа) не выполняется, пока не будет найдено действие (печать, счет). Есть хорошая статья об этом здесь
Когда действие найдено, Spark пытается оптимизировать применяемые преобразования, поэтому сначала он запускает фильтры, пытаясь уменьшить количество данных. он должен обработать:
Хотя кеш не является действием, он тоже добьется цели, так как при обнаружении действия он будет вычислять DAG до кеша, а затем использовать результат в дальнейших вычислениях
Вы можете кэшировать df
, чтобы фильтр выполнялся после groupBy
INPUT
df.show
+-------+---+-----+
|feature|key|count|
+-------+---+-----+
| u4| C| 5|
| u4| A| 1|
| u4| B| 3|
| u5| C| 5|
| u5| A| 1|
| u5| B| 3|
+-------+---+-----+
ОПРЕДЕЛЕНИЕ UDF
scala> val udf_sample = udf { (x: String) => {
| Math.random() < 0.3
| }
| }
udf_sample: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,BooleanType,Some(List(StringType)))
OUPUT
df.cache
df.filter(udf_sample(col("feature"))).show()
+-------+---+-----+
|feature|key|count|
+-------+---+-----+
| u4| C| 5|
| u4| B| 3|
| u5| C| 5|
+-------+---+-----+