什么是 Nebula Spark Connector ReaderGraph
Nebula Spark Connector Reader 是 Nebula Spark Connector 的组成部分,为您提供了 Spark SQL 接口,您可以使用 Spark SQL 接口编程读取 NebulaGraph 图数据,单次读取一个标签或边类型的数据,并将读取的结果组装成 Spark 的 DataFrame。读出的 DataFrame 可以通过 Nebula Spark Connector Writer 写入 NebulaGraph 数据库或实现不同图空间之间的数据迁移。
Nebula Spark Connector Reader 实现原理Graph
Spark SQL 是 Spark 中用于处理结构化数据的一个编程模块。它提供了一个称为 DataFrame 的编程抽象,并且可以充当分布式 SQL 查询引擎。Spark SQL 允许用户自定义数据源,支持对外部数据源进行扩展。通过 Spark SQL 读取到的数据格式是以命名列方式组织的分布式数据集 DataFrame,而且 Spark SQL 提供了众多 API 方便用户对 DataFrame 进行计算和转换,能对多种数据源使用 DataFrame 接口。
接口Graph
Spark 使用 org.apache.spark.sql
调用外部数据源包。以下为 Spark SQL 提供的扩展数据源相关的接口。
-
基本接口,包括:
BaseRelation
: 表示具有已知 Schema 的元组的集合。所有继承了BaseRelation
的子类都必须生成StructType
格式的 Schema。换句话说,BaseRelation
定义了从数据源中读取的数据在 Spark SQL 的 DataFrame 中存储的数据格式。
RelationProvider
: 获取参数列表,根据给定的参数返回一个新的BaseRelation
。
DataSourceRegister
: “注册数据源”的简称,在使用数据源时不用写数据源的全限定类名,而只需要写自定义的shortName
即可。
-
Providers 接口,包括:
RelationProvider
:从指定数据源中生成自定义的relation
。RelationProvider#createRelation
会基于给定的参数生成新的relation
。
SchemaRelationProvider
:可以基于给定的参数和给定的 Schema 信息生成新的relation
。
-
RDD 接口,包括:
RDD[InternalRow]
: 从数据源中扫描出来后,需要构造成RDD[Row]
。
Nebula Spark Connector Reader 根据 NebulaGraph 的数据源自定义了上述部分方法,从而实现自定义 Spark 外部数据源。
实现类图Graph
在 Nebula Spark Connector Reader 中,作为 Spark SQL 的外部数据源,NebulaGraph 通过 sparkSession.read
的形式读取数据。该功能实现的类图展示如下图所示。
处理流程如下:
-
定义数据源
NebulaRelationProvider
:继承RelationProvider
自定义relation
,继承DataSourceRegister
注册外部数据源。 -
定义
NebulaRelation
,实现 NebulaGraph 图数据 Schema 的获取和数据转换方法。在NebulaRelation#getSchema
方法中连接 NebulaGraph 的 Meta 服务获取配置的返回字段对应的 Schema 信息。 -
定义
NebulaRDD
读取 NebulaGraph 图数据。其中,NebulaRDD#compute
方法定义了如何读取 NebulaGraph 图数据,主要涉及到扫描 NebulaGraph 图数据、将读到的 NebulaGraph 的行(Row)数据转换为 Spark 的InternalRow
数据,以InternalRow
组成 RDD 的一行,其中每一个InternalRow
表示 NebulaGraph 中的一行数据,最终通过分区迭代的形式读取 NebulaGraph 所有数据并组装成最终的 DataFrame 结果数据。
应用示例Graph
参考 Graph。