如何在保持两个字段原始顺序的情况下打乱行?
Posted
技术标签:
【中文标题】如何在保持两个字段原始顺序的情况下打乱行?【英文标题】:How to shuffle rows with keeping two fields in original order? 【发布时间】:2016-09-12 19:53:33 【问题描述】:我有四个字段的行数组:
组、名称、键、值
我需要“洗牌”这个数组,但结果数组应符合以下规则:每个具有相同 GROUP 的 KEY-VALUE 对应与原始数组中的顺序相同
【问题讨论】:
但不是名字?好奇。 您是否需要一种可以正常工作的算法,或者是否可以按顺序生成一个新数组? 内存不是问题,数组不是很大,所以任何方式都可以 【参考方案1】:这是一种可能的算法,它需要一个与原始数组大小相同的辅助数组。它是 O(N),但它对原始数组进行了多次传递。
使用 stable counting sort algorithm,复制按 GROUP 排序的原始数组。保留直方图以供第 3 步使用。
使用Fisher-Yates shuffle algorithm 将原始数组打乱到位。
对步骤 2 中创建的混洗数组进行最后一次遍历。对于每一行,将创建的排序数组中的下一个未使用的 KEY
和 VALUE
条目替换为 KEY
和 VALUE
条目在第 1 步中。
计数排序算法假定GROUP
值是小范围内的整数,理想情况下小于原始数组中的总行数。如果不是这种情况——要么组不是整数,要么它们没有限制大小——那么可以通过将GROUP
值放在哈希表中来创建计数排序的原始直方图。哈希表的条目不能超过 N
,因此它需要 O(N) 空间和预期 O(N) 时间来创建。
如果您打算重复对同一个数组进行 shuffle,那么您应该保留已排序的数组和直方图的副本,因为这些辅助结构的构建是产生 shuffle 时间的一半以上。
【讨论】:
我知道了,最后一关没有逃脱。因此,我以更粗略的方式进行了处理 - 我为每个 GROUP 添加了 ORDER 列,从 1 到 N,然后随机播放,然后为每个 GROUP-KEY 搜索对。如果成对的 ORDER 不是偶数,我只是交换行。谢谢大家以上是关于如何在保持两个字段原始顺序的情况下打乱行?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Hive 中对文件进行重复数据删除并保持原始排序顺序?