Python pyspark-计算匹配不同组合键的项
这个问题对我来说很难解决 我需要为每个变量“key”组合计算变量“val”的匹配项数,数据库如下:Python pyspark-计算匹配不同组合键的项,python,apache-spark,pyspark,apache-spark-sql,combinations,Python,Apache Spark,Pyspark,Apache Spark Sql,Combinations,这个问题对我来说很难解决 我需要为每个变量“key”组合计算变量“val”的匹配项数,数据库如下: +----------+----------------+ | key | val | +----------+----------------+ | k1| v1 | | k1| v2 | | k2| v1
+----------+----------------+
| 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,并应用一个复杂的函数来返回所需的内容,但是,我不知道如何做,我希望有任何建议可以帮助我找到方法。您可以使用
左连接val
和相同的数据帧(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)
您可以对相同的数据帧(df)使用
左连接val
,以实现所需的输出
以下是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|
+--------+-----+
使用
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|
+--------+-----+
非常感谢。它适合我,我设法使它适应需要第三把钥匙而不是双钥匙的情况。我接受了你的解决方案,谢谢。它适合我,我设法使它适应需要第三把钥匙而不是双钥匙的情况。我接受了你的解决方案。