How to apply same function on all of the columns of a dataset in parallel using Spark(Java)
我有一个具有某些分类特征的数据集。我正在尝试将完全相同的功能应用于Spark框架中的所有这些分类功能。我的第一个假设是,我可以将每个功能的操作与其他功能的操作并行化。但是我不知道是否有可能(阅读这篇文章后感到困惑)。
例如,假设我的数据集如下:
1 2 3 4
| feature1, feature2, feature3
blue,apple,snake
orange,orange,monkey
blue,orange,horse |
我想分别计算每个特征的每个类别的出现次数。例如Feature1 (blue=2, orange=1)
- 您显示了输入数据集。那么输出数据集呢?输出结果如何?
-
我想在每个功能中找到每个类别的数量。例如:对于功能,一个输出是像2,1这样的数组。但是在这里为了简单起见,我写了红色,蓝色等类别。但在我的问题中,我将每个类别更改为位表示。例如:在第一个功能中,我有2个类别(蓝色和橙色)。我将使用2位来表示它。因此红色将是10,橙色将是01。然后我将按列求和,输出将是11,这意味着蓝色表示1表示橙色。因此,我不能使用像count这样的普通聚合。我想使用UDF。您能帮我写一下吗?
TL; DR Spark SQL的数据帧不是按列而是按行拆分,因此除非您使用类似select的运算符拆分源数据集,否则Spark会按任务(不是列)处理一组行。
如果要:
count the number of occurrences of each category for each feature, separately
仅使用groupBy和count(可能与join一起使用)或使用窗口(具有窗口聚合功能)。
- 非常感谢您的回复。使用group by之后,有什么解决方案可以应用我自己的功能吗?我在spark.apache.org/docs/latest/sql-programming-guide.html(类型安全的用户定义的聚合函数)中找到了一种解决方案。但是,我不确定这是否适合我的情况,实际上我不太了解。您能帮我吗?
-
是的。您可以使用UDAF,但我宁愿先使用本机聚合函数,而仅将UDAF作为最后的选择。
-
我想在每个功能中找到每个类别的数量。例如:对于功能,一个输出是像2,1这样的数组。但是在这里为了简单起见,我写了红色,蓝色等类别。但在我的问题中,我将每个类别更改为位表示。例如:在第一个功能中,我有2个类别(蓝色和橙色)。我将使用2位来表示它。因此红色将是10,橙色将是01。然后我将按列求和,输出将是11,这意味着蓝色表示1表示橙色。因此,我不能使用像count这样的普通聚合。我想使用UDF。你能帮我吗?