Algorithm 需要快速算法从数以万亿计的关系记录中找到互斥网络(关系)
我用一个假设表解释我的问题,该表有两列(col1,col2),如下所示: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
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()