%spark
val start = Integer.parseInt(z.input("Старт даты", "20210301").toString) // вводим дату и переводим её в целое число для дальнейших операций
val end = Integer.parseInt(z.input("Конец даты", "20210531").toString) // с интервалом времени
val XRange = Range( start, end, 1 )
// val predict = udf((edata: Double) => if (Range(20210301, 20210531, 1 ).contains(edata)) true else false) // Пользовательская функция подсчёта попадания в интервал дат
val predict = udf{ edata: String => if (XRange.contains(edata)) true else false}
val out = b2c_users_table
….
.withColumn("datetime", from_unixtime($"timestamp", "yyyMMdd")) //Урезали шаблон вывода времени по датам (больше для поиска и не надо нам)
.withColumn("Date", predict($"datetime")) // Делаем запрос к UDF функции и тут же называем новое поле "Date"
.filter(!$"Date".contains(false))
//.select($"uid", $"Date")
.groupBy($"uid")
.agg(count("*").as("count"))
.filter($"count" >= 3) // фильтруем тех пользователей, которые аутентифцировались от трёх раз
.select($"uid")
//.show(100, false)
.count()