Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyspark-计算匹配不同组合键的项_Python_Apache Spark_Pyspark_Apache Spark Sql_Combinations - Fatal编程技术网

Python pyspark-计算匹配不同组合键的项

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”的匹配项数,数据库如下:

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

非常感谢。它适合我,我设法使它适应需要第三把钥匙而不是双钥匙的情况。我接受了你的解决方案,谢谢。它适合我,我设法使它适应需要第三把钥匙而不是双钥匙的情况。我接受了你的解决方案。