Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Apache spark 带Spark的geo4j图_Apache Spark_Neo4j - Fatal编程技术网

Apache spark 带Spark的geo4j图

Apache spark 带Spark的geo4j图,apache-spark,neo4j,Apache Spark,Neo4j,我使用的是Neo4j/Cypher,我的数据约为200GB,所以我想到了可扩展的解决方案“spark” 使用spark制作neo4j图形有两种解决方案: 1) Apache Spark的密码() 2) Neo4j火花连接器 我用了第一个,帽子。 预处理的CSV得到两个“geohash”信息:一个用于拾取,另一个用于每行的放下 我想要的是制作一个geohash节点的连接图 CAPS仅允许通过映射节点生成图形: 如果要将id为0的节点连接到id为1的节点,则需要与起始id为0和结束id为1建立关系

我使用的是Neo4j/Cypher,我的数据约为200GB,所以我想到了可扩展的解决方案“spark”

使用spark制作neo4j图形有两种解决方案:

1) Apache Spark的密码()

2) Neo4j火花连接器

我用了第一个,帽子。 预处理的CSV得到两个“geohash”信息:一个用于拾取,另一个用于每行的放下 我想要的是制作一个geohash节点的连接图

CAPS仅允许通过映射节点生成图形: 如果要将id为0的节点连接到id为1的节点,则需要与起始id为0和结束id为1建立关系

一个非常简单的布局是:

Nodes: (just id, no properties)

id
0
1
2

Relationships: (just the mandatory fields)

id | start | end
0  | 0     | 1
1  | 0     | 2
基于此,我将我的CSV加载到Spark数据框中,然后将数据框拆分为:

  • 拾取数据帧

  • 放下数据帧和

  • 行程数据帧

我已经为前两个数据帧生成了一个id,并通过向第三个数据帧添加列创建了一个映射 结果是: 为每个映射行生成的一对节点(拾取-[Trip]->drop-off)

我遇到的问题是:

1) 对于不同的行程,可以重复拾取或放下的geohash=>我想合并节点的创建

2) 一次旅行的下车可能是另一次旅行的接送,因此我需要将这两个节点合并为一个节点

我试图更改该图,但我很惊讶spark图是不可变的=>您无法应用cypher查询来更改它

那么,有没有一种方法可以使用spark创建一个连接的定向的合并的geohash图形

这是我的代码:


你说得对,CAPS就像Spark一样,是一个不变的系统。但是,使用CAPS,您可以从Cypher语句中创建新的图形:

目前,
CONSTRUCT
子句对
MERGE
的支持有限。它只允许将已经绑定的节点添加到新创建的图中,而每个绑定节点只添加一次,与绑定表中出现的次数无关

考虑以下查询:

MATCH (n), (m)
CONSTRUCT
  CREATE (n), (m)
RETURN GRAPH
结果图的节点数与输入图的节点数相同

要解决您的问题,可以使用两种方法:a)在创建图形之前已消除重复数据,b)使用密码查询。方法b)看起来像:

// assuming that graph is the graph created at step 11
session.catalog.store("inputGraph", graph)

session.cypher("""
  CATALOG CREATE GRAPH temp {
    FROM GRAPH session.inputGraph
    MATCH (n)
    WITH DISTINCT n.a AS a, n.b as b
    CONSTRUCT 
      CREATE (:HashNode {a: a, b as b})
    RETURN GRAPH
  }
""".stripMargin)

val mergeGraph = session.cypher("""
  FROM GRAPH inputGraph
  MATCH (from)-[via]->(to)
  FROM GRAPH temp
  MATCH (n), (m)
  WHERE from.a = n.a AND from.b = n.b AND to.a = m.a AND to.b = m.b
  CONSTRUCT 
    CREATE (n)-[COPY OF via]->(m)
  RETURN GRAPH
""".stripMargin).graph

注意:使用bot拾取和丢弃节点(例如a和b)的属性名称

请粘贴导入脚本好吗?我使用了spark的功能导入CSV文件,不过我在问题中添加了完整的注释代码,为了更加精确,您的第一个密码查询中存在一个问题:皮卡节点中的geohash字段是_c20,但是在dropoff nodes=>中它是_c22,所以这个解决方案不起作用是的,我想我在上面的注释中已经解决了这个问题。在图形导入期间,您可以修改Dropoff_映射,使其具有与拾取相同的属性名称,因为它们表示相同的概念,我想这是有意义的。您的意思是重命名列以具有相同的名称,我将尝试此确定,它仅适用于geohash,但是节点除了geohash之外还有其他属性,需要在合并节点中复制的。例如:(n1,geohash,p1)(n2,geohash,p2)(n3,geohash,p3)=>(n,geohash,p1,p2,p3)你能用同样的方法重命名它们吗?
// assuming that graph is the graph created at step 11
session.catalog.store("inputGraph", graph)

session.cypher("""
  CATALOG CREATE GRAPH temp {
    FROM GRAPH session.inputGraph
    MATCH (n)
    WITH DISTINCT n.a AS a, n.b as b
    CONSTRUCT 
      CREATE (:HashNode {a: a, b as b})
    RETURN GRAPH
  }
""".stripMargin)

val mergeGraph = session.cypher("""
  FROM GRAPH inputGraph
  MATCH (from)-[via]->(to)
  FROM GRAPH temp
  MATCH (n), (m)
  WHERE from.a = n.a AND from.b = n.b AND to.a = m.a AND to.b = m.b
  CONSTRUCT 
    CREATE (n)-[COPY OF via]->(m)
  RETURN GRAPH
""".stripMargin).graph