我想计算数据框中列值的频率Spark I.e计算出现最高值的等级。我们如何在Spark中为此定义数据框UDF?
答案 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_list
和count
。因为partitionBy
会让每个组分布在spark worker节点中,而整个数据集中的collect_list
和count
都不是这样。
为了测试目的,创建了dataframe
+----+
|col1|
+----+
|35 |
|25 |
|25 |
|25 |
|19 |
|19 |
|19 |
|19 |
|70 |
+----+
您可以在partitionBy
函数中使用Window
,执行每个分区的counts
和concat
" 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|
+----+------+
我希望答案很有帮助