pyspark- 计数匹配不同组合键的项目

pyspark- count items that match for different key combinations

这个问题我很难解决

我需要为变量“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      |
    +----------+----------------+

我的想法是一种 gr​​oupBy 并应用一个复杂的函数 returns 需要什么,但是,我不知道该怎么做,我将不胜感激任何能帮助我找到方式。

您可以将 left join on val 与 same 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)

使用 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|
+--------+-----+