pyspark count匹配不同键组合的项

xa9qqrwz  于 2021-05-16  发布在  Spark
关注(0)|答案(2)|浏览(435)

这个问题对我来说很难解决。
我需要为每个组合的变量“key”计算变量“val”的匹配项数,数据库如下:

+----------+----------------+
    |    key   |        val     |
    +----------+----------------+
    |        k1|         v1     |
    |        k1|         v2     |
    |        k2|         v1     |
    |        k2|         v3     |
    |        k3|         v1     |
    |        k3|         v2     |
    |        k3|         v3     |
    |        k4|         v3     |
    |        k4|         v5     |
    +----------+----------------+

所需输出为

+----------+----------------+
    |    keys  |        count   |
    +----------+----------------+
    |   [k1,k2]|         1      |
    |   [k1,k3]|         2      |
    |   [k2,k1]|         1      |
    |   [k2,k3]|         2      |
    |   [k2,k4]|         1      |
    |   [k3,k1]|         2      |
    |   [k3,k2]|         2      |
    |   [k3,k4]|         1      |
    |   [k4,k2]|         1      |
    |   [k4,k3]|         1      |
    +----------+----------------+

我的想法是一种groupby和应用一个复杂的函数,返回所需的,但是,我不知道怎么做,我会感谢任何建议,帮助我找到方法。

eoigrqb6

eoigrqb61#

你可以用 left join on val 用相同的Dataframe(df)来实现你想要的输出。
以下是spark sql的等效答案:

df.createOrReplaceTempView('r')
 df.createOrReplaceTempView('l')

 desired_df = spark.sql('select array(l.key , r.key) as keys, count(l.val) as count from l left join r on l.val = r.val where l.key !=r.key group by 1)
ru9i0ody

ru9i0ody2#

使用 val ,将密钥收集到一个数组中,然后按密钥数组分组并计数。

results = df.join(
    df.withColumnRenamed('key', 'key2'),
    'val'
).filter('key != key2').select(
    F.array('key', 'key2').alias('keys'), 
    'val'
).groupBy('keys').count().orderBy('keys')

results.show()
+--------+-----+
|    keys|count|
+--------+-----+
|[k1, k2]|    1|
|[k1, k3]|    2|
|[k2, k1]|    1|
|[k2, k3]|    2|
|[k2, k4]|    1|
|[k3, k1]|    2|
|[k3, k2]|    2|
|[k3, k4]|    1|
|[k4, k2]|    1|
|[k4, k3]|    1|
+--------+-----+

相关问题