【发布时间】:2019-03-13 16:40:11
【问题描述】:
我想在带有我自己的相等比较器的 DataFrame 上使用 GroupBy 运算符。
假设我想执行如下操作:
df.groupBy("Year","Month").sum("Counter")
在这个数据帧中:
Year | Month | Counter
---------------------------
2012 | Jan | 100
12 | January | 200
12 | Janu | 300
2012 | Feb | 400
13 | Febr | 500
我必须实现两个比较器:
1) 对于列年份:p.e. “2012”==“12”
2) 对于月份列:p.e. "一月" == "一月" == "一月"
假设我已经实现了这两个比较器。我怎样才能调用它们?与this 示例一样,我已经知道我必须将我的 DataFrame 转换为 RDD 才能使用我的比较器。
我考虑过使用RDD GroupBy。
请注意,我确实需要使用比较器来做到这一点。我无法使用 UDF、更改数据或创建新列。未来的想法是拥有密文列,其中我有允许我比较两个密文是否相同的功能。我想在我的比较器中使用它们。
编辑:
此刻,我试图只用一列来做到这一点,例如:
df.groupBy("Year").sum("Counter")
我有一个 Wrapper 类:
class ExampleWrapperYear (val year: Any) extends Serializable {
// override hashCode and Equals methods
}
那么,我正在这样做:
val rdd = df.rdd.keyBy(a => new ExampleWrapperYear(a(0))).groupByKey()
我的问题是如何进行“求和”,以及如何将 keyBy 与多列一起使用以使用 ExampleWrapperYear 和 ExampleWrapperMonth。
【问题讨论】:
-
为什么要使用比较器??
-
我的目标是了解我是否可以使用比较器来做到这一点。正如我在问题中所说,我未来的目标是使用密文,我不能使用 UDF 来解密服务器端的数据。想象一下,我有一个包含 3 个条目的“年龄”列:20、25、20。在使用非确定性密码加密数据后,我得到一个包含 XXX、YYY、ZZZ 的列(总是不同的值)。我有一个函数告诉我 XXX 和 ZZZ 是相同的(只是一个例子)。所以我想调用一个比较器来调用我的函数,让我知道它们是相同的。
-
所以我理解正确,比较器告诉您它们相等,但您无法将加密值映射到它们相等的空间?
-
是的,这是我的挑战。我发现这个example 可能与我的提议非常相似。但我不明白如何在我的情况下应用它。例如,在我上面提出的查询中。
-
为了简单起见,如果你只有一个告诉你键是否相等的函数,你唯一的解决方案是叉积并进行每一对比较。比这更好的唯一方法是让您告诉我们更多有关您的具体用例的信息,以便我们找到降低复杂性的技巧。
标签: scala sorting apache-spark apache-spark-sql