java - 如何在 Spark 中对 DataSet 的窗口进行二次采样?
问题描述
假设我有一个DataSet
看起来像这样的:
Name | Grade
---------------
Josh | 94
Josh | 87
Amanda | 96
Karen | 78
Amanda | 90
Josh | 88
我想创建一个新的DataSet
,其中每个名称有 3 行,其中额外的行(如果有)是从同名的行中采样的(例如,Karen 将有三个相同的行)。
如何在不遍历每个名称的情况下做到这一点?
解决方案
资料准备:
val df = Seq(("Josh",94),("Josh",87),("Amanda",96),("Karen",78),("Amanda",90),("Josh",88)).toDF("Name","Grade")
仅当您的数据skewed
用于 a时才执行以下Name
操作:添加一个随机数,并为每个 过滤前 3 个随机数Name
。
val df2 = df.withColumn("random", round(rand()*10))
import org.apache.spark.sql.expressions.Window
val windowSpec = Window.partitionBy("Name").orderBy("random")
val df3 = df2.withColumn("row_number",row_number.over(windowSpec))
.filter($"row_number" <= 3)
现在,汇总每个 的值Name
并重复 3 次,以确保每个 至少有 3 条记录Name
。然后最后取第一个 3 个值,然后explode
df4.groupBy("Name").agg(collect_list("Grade") as "grade_list")
.withColumn("temp_list", slice( flatten(array_repeat($"grade_list", 3)), 1,3))
.select($"Name",explode($"temp_list") as "Grade").show
备注:
- 由于上面的代码在 中最多有 3 个值
grade_list
,因此复制 3 次不会造成伤害。 - 如果您不使用该
Window
步骤,则可以组合使用when( size($"grade_list") === n, ).otherwise()
上述不必要的重复。
推荐阅读
- python - 棉花糖模式中未返回相关字段(也是烧瓶/sqlalchemy)
- python-3.x - tkinter 使用鼠标滚轮垂直滚动多个文本区域
- java - 如果 try catch 已经存在并且只有一个特定的 catch 会抛出异常吗?
- c# - 如何在 Unity 中为 FirstPersonCharacter 相机以 15fps 的速度捕获屏幕截图
- python - Python Web Scrape using Beautiful Soup - 从页面返回所有产品详细信息
- sql - 使用 vertica 对表进行转置
- javascript - 使用 JQuery 选择的选项 - 在 Chrome 中工作但在页面加载时不工作
- go - 等待完成后我们是否需要创建新的等待组?
- python - 当我尝试使用运算符比较两个列表时如何修复错误
- event-handling - 应该在哪里实施确切的端口?