保存从配置单元表中的 oracle 查询创建的 Spark DataFrame?

Posted

技术标签:

【中文标题】保存从配置单元表中的 oracle 查询创建的 Spark DataFrame?【英文标题】:Saving Spark DataFrame created from an oracle query in a hive table? 【发布时间】:2018-11-01 23:42:46 【问题描述】:

我在 Cloudera 平台上通过 HUE 使用 impala/hive。

如果我通过 Pyspark 将表从 hive 拉到 Spark DataFrame 中,我可以将其保存为不同的表,如下所示:

sdf.write.mode("overwrite").saveAsTable("schema.PythonTest")

然后,当我在 hive/impala 下刷新 HUE 中的表时,我可以在那里看到新表并开始使用它编写 HQL。

但是,当我将数据从 oracle 提取到 Spark Dataframe 时,在尝试与上述相同的语法时会出错。

sdf = spark.read \
.format("jdbc") \
.option("url", "jdbc:oracle:thin:UN/PW!@blah.bleh.com:port/sid") \
.option("dbtable", mysql) \
.option("user", "UN") \
.option("password", "pw!") \
.option("driver", "oracle.jdbc.driver.OracleDriver") \
.load()

我无法解释。为什么当 hive 查询将数据拉入 sdf 时语法会起作用,而 oracle 不会?

oracle 的 sql 运行良好,出于测试目的,它只有 2 列和 2 行。当我使用 type(sdf) 函数时,我可以清楚地看到我正在成功创建 Spark DataFrame。

我是否缺少某些设置或步骤?

【问题讨论】:

拉取数据时遇到的错误是什么?要回答这个问题,为什么当 hive 查询将数据拉入 sdf 时语法会起作用,而 oracle 不会这样做,您应该在编写时提供错误。对于 HiveContext,from pyspark.sql import HiveContext hiveContext = HiveContext(sc). 【参考方案1】:

从 Oracle 提取数据时遇到什么错误? 格式也应该是jdbc吗?

【讨论】:

当我从 oracle 拉取时我没有收到错误,当我尝试将我从该 oracle 拉取的 spark 数据帧保存到 Hive 中时,我得到了我的错误。去寻找一些可以帮助我在公共环境中重新创建它的东西。我想我需要将配置单元上下文添加到数据框中,但我不知道该怎么做。【参考方案2】:

如果您遇到这种情况:

确保您没有停止和启动 SparkContext。如果是这样,您很可能没有包括默认设置中的必要选项,这将允许 Spark DataFrame 通过 saveAsTable 保存到 hive。

我重新启动了我的内核,跳过了我正在停止的单元格并启动了一个新的 SparkContext 并且工作正常。

【讨论】:

以上是关于保存从配置单元表中的 oracle 查询创建的 Spark DataFrame?的主要内容,如果未能解决你的问题,请参考以下文章

尝试从表中运行 select count(*) 查询时在配置单元中出错

如何基于非选择查询创建配置单元表

使用函数调用从选择中插入到表的 Oracle 中的性能

如何更新配置单元表中的值?

无法使用 pyspark 从 hive 表中查询复杂的 SQL 语句

oracle 创建一个传参查询视图