如何使用 Spark(Java)在数据集的所有列上并行应用相同的函数
Posted
技术标签:
【中文标题】如何使用 Spark(Java)在数据集的所有列上并行应用相同的函数【英文标题】:How to apply same function on all of the columns of a dataset in parallel using Spark(Java) 【发布时间】:2017-05-26 03:51:42 【问题描述】:我有一个包含一些分类特征的数据集。我正在尝试对 Spark 框架中的所有这些分类功能应用完全相同的功能。我的第一个假设是我可以将每个功能的操作与其他功能的操作并行化。但是我不知道这是否可能(阅读this,this 后感到困惑)。
例如,假设我的数据集如下:
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,橙色为 1。因此,我不能使用像计数这样的普通聚合。我想使用UDF。你能帮我看看怎么写吗? 【参考方案1】:TL;DR Spark SQL 的 DataFrames 不是按列拆分而是按行拆分,因此 Spark 按任务(而不是列)处理一组行,除非您使用 select
-like 运算符拆分源数据集。
如果你想:
分别计算每个特征的每个类别的出现次数
只需使用groupBy
和count
(可能使用join
)或使用窗口(使用窗口聚合函数)。
【讨论】:
非常感谢您的回复。使用 group by 后,有什么解决方案可以应用我自己的功能吗?我在spark.apache.org/docs/latest/sql-programming-guide.html(类型安全的用户定义的聚合函数)中找到了解决方案。但是,我不确定它是否适用于我的情况,实际上我无法真正理解它。你能帮我解决一下吗? 是的。您可以使用 UDAF,但我宁愿先使用原生聚合函数,并且仅将 UDAF 作为最后的手段。 我想在每个特征中找到每个类别的数量。例如:对于特征一,输出是一个像 2,1 这样的数组。但在这里为简单起见,我写了红色、蓝色等类别。但在我的问题中,我会将每个类别更改为位表示。例如:在第一个功能中,我有 2 个类别(蓝色和橙色)。我将使用 2 位来表示它。所以红色为 10,橙色为 01。然后我将按列求和,输出为 11,这意味着蓝色为 1,橙色为 1。因此,我不能使用像计数这样的普通聚合。我想使用UDF。你能帮帮我吗?以上是关于如何使用 Spark(Java)在数据集的所有列上并行应用相同的函数的主要内容,如果未能解决你的问题,请参考以下文章
使用 Java 在 Spark 2.0 中使用数据集的 GroupByKey
如何使用 Spark 数据框列上的函数或方法使用 Scala 进行转换
Java Spark:使用未知连接列名称连接的数据集的 Spark 错误解决方法