Это прекрасно работает:
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")