Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Algorithm 需要快速算法从数以万亿计的关系记录中找到互斥网络(关系)_Algorithm_Pyspark_Bigdata - Fatal编程技术网

Algorithm 需要快速算法从数以万亿计的关系记录中找到互斥网络(关系)

Algorithm 需要快速算法从数以万亿计的关系记录中找到互斥网络(关系),algorithm,pyspark,bigdata,Algorithm,Pyspark,Bigdata,我用一个假设表解释我的问题,该表有两列(col1,col2),如下所示: col1 col2 A <--> B A <--> C E <--> F B <--> D E <--> G col1 col2 A B A C EF B-D 例如 这个表在一个文件中。在上述情况下,我想将其划分为相互排斥的关系文件。因此,上表的结果将是两个文件(表): col1 col2 A B A C B-D 及 col1 col2 EF 例如

我用一个假设表解释我的问题,该表有两列(col1,col2),如下所示:

col1   col2
A <--> B
A <--> C
E <--> F
B <--> D   
E <--> G
col1 col2
A B
A C
EF
B-D
例如
这个表在一个文件中。在上述情况下,我想将其划分为相互排斥的关系文件。因此,上表的结果将是两个文件(表):

col1 col2
A B
A C
B-D

col1 col2
EF
例如
真正的文件有数以万亿计的唯一记录(关系),我想将其划分为相互排斥的关系文件。需要任何智能算法的帮助。我正在使用pyspark读取拼花地板文件中的表格。所以,任何pyspark代码都很好,但不是必需的(算法更重要)

所谓“相互排斥”,可能是指没有共同的节点。这个问题称为图中连接组件的枚举。您可以使用联合查找技术来解决这个问题

对于每个节点,将链接与属于同一组件的另一个节点相关联。考虑新关系时,使其中一个成员链接到另一个成员

有关详细信息,请参阅。 这个过程很快,您可以通过所谓的路径压缩技术来加速它

最后,每个组件都有一个没有链接到任何其他组件的节点,列出所有组件及其包含的节点并不是什么大问题

处理给定示例的步骤可以是

A -> B
C -> A -> B
C -> A -> B, E -> F
C -> A -> B -> D, E -> F
C -> A -> B -> D, E -> F -> G

(得到线性列表纯粹是偶然的)。

使用Spark,速度非常快。对于那些处理大数据的人来说,它可能很有用:

from pyspark import SparkContext
from pyspark.sql.types import *
from pyspark.sql import Row
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, size, length
from pyspark.sql.functions import *


spark = SparkSession.builder \
    .appName("Python Spark SQL") \
    .config("spark.driver.memory", "32g") \
    .config("spark.executor.memory", "32g") \
    .config("spark.executor.cores", "12") \
    .config("spark.local.dir", "~/mytmp") \
    .config("spark.jars.packages", "graphframes:graphframes:0.5.0-spark2.1-s_2.11") \
    .getOrCreate()
SparkContext.setSystemProperty('spark.executor.memory', '32g')
sc = spark.sparkContext

df = spark.read.parquet("my_table_file.parquet")
df.registerTempTable("mytable")
# df has two columns : col1 and col2. Similar to hypothetical table presented in my question

v = spark.sql("select col1 as id from mytable union select col2 as id from mytable ")
e = spark.sql("select col1 as src, col2 as dst from mytable")
sc.setCheckpointDir("~/cc_checkpoint")

from graphframes import *
g = GraphFrame(v, e)
connected = g.connectedComponents()
connected.registerTempTable("mytable_connected_components")
connected.select("component").distinct().count()

到目前为止你试过什么?给我们看一些代码!我认为您正在图中寻找连接的组件(您称之为网络)。这是一个研究很多的问题,我相信有线性复杂度的解决方案。从您喜爱的搜索引擎中查找帮助应该不会有太大困难。谢谢。我试过谷歌,但不知道搜索的实际术语。
A -> B
C -> A -> B
C -> A -> B, E -> F
C -> A -> B -> D, E -> F
C -> A -> B -> D, E -> F -> G
from pyspark import SparkContext
from pyspark.sql.types import *
from pyspark.sql import Row
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, size, length
from pyspark.sql.functions import *


spark = SparkSession.builder \
    .appName("Python Spark SQL") \
    .config("spark.driver.memory", "32g") \
    .config("spark.executor.memory", "32g") \
    .config("spark.executor.cores", "12") \
    .config("spark.local.dir", "~/mytmp") \
    .config("spark.jars.packages", "graphframes:graphframes:0.5.0-spark2.1-s_2.11") \
    .getOrCreate()
SparkContext.setSystemProperty('spark.executor.memory', '32g')
sc = spark.sparkContext

df = spark.read.parquet("my_table_file.parquet")
df.registerTempTable("mytable")
# df has two columns : col1 and col2. Similar to hypothetical table presented in my question

v = spark.sql("select col1 as id from mytable union select col2 as id from mytable ")
e = spark.sql("select col1 as src, col2 as dst from mytable")
sc.setCheckpointDir("~/cc_checkpoint")

from graphframes import *
g = GraphFrame(v, e)
connected = g.connectedComponents()
connected.registerTempTable("mytable_connected_components")
connected.select("component").distinct().count()