使用PySpark从Neo4j中提取数据

时间:2016-07-21 18:07:04

标签: python neo4j pyspark

我的时间序列当前存储为 Neo4j 服务器实例版本2.3.6中的图形(使用时间树结构,类似于this)(仅限REST接口,没有螺栓)。我想要做的是使用 PySpark 以分布式方式对这些时间序列进行一些分析。

现在,我知道将Spark与Neo4j连接的现有项目,尤其是列出here的项目。这些问题是他们专注于创建一个使用图形的界面。在我的情况下,图形是不相关的,因为我的Neo4j Cypher查询旨在生成值数组。下游的一切都是关于处理这些数组作为时间序列;再次,而不是图。

我的问题是:是否有人使用PySpark成功并行查询仅支持REST的Neo4j实例,如果是,您是如何做到的? py2neo 库似乎是一个很好的候选者,直到我意识到连接对象无法跨分区共享(或者如果它可以,我不知道如何)。现在我正在考虑让我的Spark作业在Neo4j服务器上运行独立的REST查询,但我想看看社区如何解决这个问题。

Best,Aurélien

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解问题。但在我阅读时:

  • 连接Neo4J或处理任何Neo4J特定元素都没有问题。
  • 您无法正确管理多个分区;没有持久性或手段来确保跨分区的通信是正确的。

如果我的理解是正确的:

  • 我建议您查看(pandas) Spark UDFs
    • 这些与Neo4J无关,但是我发现它们是处理任何临时ETL工作(任何 特别 )的好方法em>汇总或计算可以在单个分区上完成。
    • 这是一个令人惊讶的易于使用的API,除了在UDF中对模式进行先验定义可能会很麻烦。

从文档中:

import pandas as pd

from pyspark.sql.functions import pandas_udf

@pandas_udf("col1 string, col2 long")
def func(s1: pd.Series, s2: pd.Series, s3: pd.DataFrame) -> pd.DataFrame:
    s3['col2'] = s1 + s2.str.len()
    return s3

# Create a Spark DataFrame that has three columns including a sturct column.
df = spark.createDataFrame(
    [[1, "a string", ("a nested string",)]],
    "long_col long, string_col string, struct_col struct<col1:string>")

df.printSchema()
# root
# |-- long_column: long (nullable = true)
# |-- string_column: string (nullable = true)
# |-- struct_column: struct (nullable = true)
# |    |-- col1: string (nullable = true)

df.select(func("long_col", "string_col", "struct_col")).printSchema()
# |-- func(long_col, string_col, struct_col): struct (nullable = true)
# |    |-- col1: string (nullable = true)
# |    |-- col2: long (nullable = true)

请注意,那些pd.Seriespd.DataFrame并不是您必须创建的熊猫对象。相反,通过用@pandas_udf装饰函数,可以提供Spark对象,并且它们在每个分区中都像熊猫对象一样对待。

除了说它已经适用于我需要尝试的任何奇怪的UDF(如果可以先验地知道该模式!),我不知道除此之外的技术细节。 / p>