apache spark—所有元素的计数小于行中的值

nmpmafwu  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(370)

给定一个Dataframe

value
-----
0.3
0.2
0.7
0.5

是否有一种方法可以构建一个列,该列包含每行中小于或等于行值的元素的计数?明确地,

value   count_less_equal
-------------------------
0.3     2
0.2     1
0.7     4
0.5     3

我可以按值列分组,但我不知道如何筛选行中小于该值的所有值。
我在想,也许可以复制第一列,然后创建一个过滤器,以便 col1 我们可以在 col2 小于 col1 价值观。

col1   col2
-------------------------
0.3     0.3
0.2     0.2
0.7     0.7
0.5     0.5
ukdjmx9f

ukdjmx9f1#

您可以使用自联接并对执行联接 t1.user_id>=t2.user_id 以得到期望的结果。

from pyspark.sql import SparkSession

    spark = SparkSession.builder \
        .appName('SO')\
        .getOrCreate()

    sc= spark.sparkContext

    df = sc.parallelize([
        ([0.3]), ([0.2]), ([0.7]), ([0.5])

    ]).toDF(["value"])

    df.show()

    # +-------+
    # |user_id|
    # +-------+
    # |    0.3|
    # |    0.2|
    # |    0.7|
    # |    0.5|
    # +-------+

    df.createTempView("table")

    spark.sql('select t1.value, count(*) as count from table t1 join table t2 on t1.value>=t2.value  group by t1.value order by value').show()

    # +-----+-----+
    # |value|count|
    # +-----+-----+
    # |  0.2|    1|
    # |  0.3|    2|
    # |  0.5|    3|
    # |  0.7|    4|
    # +-----+-----+
8yparm6h

8yparm6h2#

您可以使用窗口函数对它们进行排序并计算它们下面的唯一值

import pyspark.sql.functions as F
from pyspark.sql import Window
tst= sqlContext.createDataFrame(
[
(1,0.3),
(2,0.2),
(3,0.7),
(4,0.5),
(5,0.5),
(3,0.7),
(6,1.0),
(9,0.4)
],schema=['id','val'])
w=Window.orderBy('val') # consider adding a partition column here; If none consider salting
tst1 = tst.withColumn("result",F.size((F.collect_set('val')).over(w)))

tst1.show()
+---+---+------+
| id|val|result|
+---+---+------+
|  2|0.2|     1|
|  1|0.3|     2|
|  9|0.4|     3|
|  5|0.5|     4|
|  4|0.5|     4|
|  3|0.7|     5|
|  3|0.7|     5|
|  6|1.0|     6|
+---+---+------+

相关问题