Apache spark Spark Dataframe-每天随机抽样记录

Apache spark Spark Dataframe-每天随机抽样记录,apache-spark,Apache Spark,我在Hive中有一些数据,其中我每天有大约500k个独特的客户ID。数据跨度为2个月,在日期进行分区。以下是分布的情况- +----------+---------------+ | date|unique_visitors| +----------+---------------+ |2019-01-01| 500,000| |2019-01-02| 500,000| |2019-01-03| 500,000| |2019-01-04|

我在Hive中有一些数据,其中我每天有大约500k个独特的客户ID。数据跨度为2个月,在
日期进行分区。以下是分布的情况-

+----------+---------------+
|      date|unique_visitors|
+----------+---------------+
|2019-01-01|        500,000|
|2019-01-02|        500,000|
|2019-01-03|        500,000|
|2019-01-04|        500,000|
|2019-01-05|        500,000|
|2019-01-06|        500,000|
|..........|         ..... |
|2019-02-27|        500,000|
|2019-02-28|        500,000|
+----------+---------------+
我想实现一个函数,它将
N
作为输入,并在输出表中每天为我提供那么多记录

例如,如果我将
N
设为
250k
,那么我希望针对所有60天的数据,每天随机抽取
250k
唯一的客户ID,这样我就可以在我的输出表中保持每天观众人数的一致性

因此,输出表中的总记录数为
250k*60
。下面是我的输出表的分布情况-

+----------+---------------+
|      date|unique_visitors|
+----------+---------------+
|2019-01-01|        250,000|
|2019-01-02|        250,000|
|2019-01-03|        250,000|
|2019-01-04|        250,000|
|2019-01-05|        250,000|
|2019-01-06|        250,000|
|..........|         ..... |
|2019-02-27|        250,000|
|2019-02-28|        250,000|
+----------+---------------+

如何使用Spark实现这一点?

我只需使用窗口函数partitionBy按日期进行分区,并按随机值排序即可。我们使用该窗口函数添加一个“rank”列,然后按小于“n”值的列进行过滤,然后删除“rank”列

import org.apahce.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
import spark.implicits._

val n = 250000
val w = Window.partitionBy($"date").orderBy(rand())
val res = df.withColumn("rank", rank().over(w)).filter($"rank" <= n).drop("rank")
import org.apahce.spark.sql.functions_
导入org.apache.spark.sql.expressions.Window
导入spark.implicits_
val n=250000
val w=Window.partitionBy($“date”).orderBy(rand())
val res=df.withColumn(“rank”,rank().over(w)).filter($“rank”