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 |
+----------+----------------+
我的想法是一种 groupBy 并应用一个复杂的函数 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|
+--------+-----+
这个问题我很难解决
我需要为变量“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 并应用一个复杂的函数 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|
+--------+-----+