UDF用于计算Spark中的频率(值的等级)

时间:2017-07-30 20:52:47

标签: scala apache-spark apache-spark-sql spark-streaming

我想计算数据框中列值的频率Spark I.e计算出现最高值的等级。我们如何在Spark中为此定义数据框UDF?

2 个答案:

答案 0 :(得分:0)

这不是UDF的工作。我想你想要一个简单的聚合:

df.groupBy("column").count.orderBy($"count".desc)

您可以使用

添加排名
withColumn(rank, rank.over(Window.orderBy($"count".desc")))

但高基数可能会很昂贵。

df.groupBy("column").count.orderBy($"count".desc).rdd.zipWithIndex.toDF

可能是另一种选择,但它不是真正的排名。

答案 1 :(得分:0)

如果可用,您应该使用inbuilt functions而不是使用udf函数,因为udf函数会要求您对数据进行序列化和反序列化。

partitionBy函数中使用Window可以比列中的整个数据更快地完成工作collect_listcount。因为partitionBy会让每个组分布在spark worker节点中,而整个数据集中的collect_listcount都不是这样。

为了测试目的,创建了dataframe

+----+
|col1|
+----+
|35  |
|25  |
|25  |
|25  |
|19  |
|19  |
|19  |
|19  |
|70  |
+----+

您可以在partitionBy函数中使用Window,执行每个分区的countsconcat" Rank"计数如下

df.withColumn("Ranks", concat(lit("Rank "), count("col1").over(Window.partitionBy("col1"))))

你应该得到你想要的输出

+----+------+
|col1|Ranks |
+----+------+
|19  |Rank 4|
|19  |Rank 4|
|19  |Rank 4|
|19  |Rank 4|
|35  |Rank 1|
|25  |Rank 3|
|25  |Rank 3|
|25  |Rank 3|
|70  |Rank 1|
+----+------+

我希望答案很有帮助