Сделать абсолютную работу внутри фильтрации в Scala - PullRequest
0 голосов
/ 01 февраля 2020

Я хочу вернуть процент результатов из набора данных. Будучи нубом в Scala, попробовал следующее

ds.filter(abs(hash(col("source"))) % 100 < percentage)

, но получить абс нельзя (org. apache .spark. sql .Column). Я не хочу пробовать это, я хочу вернуться, основываясь на ха sh столбца, чтобы он определялся c даже при изменении набора данных.

1 Ответ

1 голос
/ 01 февраля 2020

Это прекрасно работает:

ds.filter(abs(hash(col("source"))) % 100 < percentage)

Возможно, у вас есть несколько abs в вашем пространстве имен (например, из таких импортов, как import math._ et c. Чтобы быть уверенным, используйте

ds.filter(org.apache.spark.sql.functions.abs(hash(col("source"))) % 100 < percentage)

Но я думаю, что это не гарантирует, что вы получите точный процент, потому что значения ha sh могут распределяться неравномерно (подумайте о кадре данных только с 1 уникальным значением source, значения ha sh все будут одинаковыми .... вы получите либо все записи, либо ни одной. Чтобы получить точный процент, вам понадобится что-то вроде:

val newDF = df
 .withColumn("rnb",row_number().over(Window.orderBy($"source"))) // or order by hash if you wish
 .withColumn("count",count("*").over())
 .where($"rnb" < lit(fraction)*$"count")
...