2

当使用sparkJDBCDatasetJDBC 连接加载表时,我一直遇到 spark 找不到我的驱动程序的错误。驱动程序肯定存在于机器上,并且它的目录spark.ymlconfig/base.

我也按照说明添加了def init_spark_session方法到src/project_name/run.py. 不过,我很怀疑,这里定义的 sparksession 并没有被sparkJDBCDataset班级接受。当您查看用于创建 sparksession 并在其中加载数据集的源代码时sparkJDBCDataset,看起来就像定义了一个没有配置的 vanilla sparksession 来加载和保存数据。内部定义的配置spark.yml不用于创建此 sparksession。以下是源代码的摘录

    @staticmethod
    def _get_spark():
        return SparkSession.builder.getOrCreate()

    def _load(self) -> DataFrame:
        return self._get_spark().read.jdbc(self._url, self._table, **self._load_args)

当我从 Kedro 外部的 jdbc 源加载数据时,使用定义的 SparkSession spark.jars,数据按预期加载。

在构建读取数据的 sparksession 时,有没有办法指定spark.jars其他 sparkConf?

4

1 回答 1

0

SparkSession.builder.getOrCreate 实际上会按照它所说的那样做,并将获得现有的火花会话。但是,您是对的,如果没有现有会话,那么将创建一个普通会话。

运行 init_spark_session 的最佳位置是在你的 run_package 函数中,在你的 run.py 上下文中,在上下文加载之后。当调用 kedro run 命令时,就会调用 run.py。

如果您希望单独测试您的目录,那么这里的简单工作是确保在您的测试代码或您拥有的代码中,在执行 JDBC 连接代码之前手动调用 init_spark_session。

这可以通过以下方式完成:

from kedro.context import load_context
kedro_project_path = “./“
context = load_context(kedro_project_path)
context.init_spark_session()

kedro_project_path 适合的地方。

抱歉格式化顺便说一句,我在手机上。

于 2020-03-19T05:27:09.990 回答