如何通过 Spack JDBC 选择特定列?

Posted

技术标签:

【中文标题】如何通过 Spack JDBC 选择特定列?【英文标题】:How to select specific columns through Spack JDBC? 【发布时间】:2016-10-04 03:04:34 【问题描述】:

现在我正在使用 Spark 连接我的 oracle 数据库。但是,有一种名为“TIMESTAMP WITH TIMEZONE”的列类型,它是 Oracle 中的特定列。当我从表中加载数据而不是包含此类型列时,它会抛出错误“java.sql.SQLException: Unsupported type -101”。

有人知道如何从表中加载特定列吗?然后我可以避免选择“TIMESTAMP WITH TIMEZONE”列。如果有人能找出“java.sql.SQLException: Unsupported type -101”错误会更好。但我认为这可能是 Spark 的一个错误。

我的代码如下,非常感谢。

spark = SparkSession\
    .builder\
    .appName("TestSQL")\
    .getOrCreate()
orc = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:oracle:thin:xxx/xxx@IP:1521/database") \
    .option("dbtable", "xxx.xxx") \
    .load() 

【问题讨论】:

【参考方案1】:

options 中,您可以传递 sql query in dbtable 键。在sql查询中,您可以选择所需的列。

例如:

final String dbTable =
        "(select emp_no, concat_ws(' ', first_name, last_name) as full_name from employees) as employees_name";

Dataset<Row> jdbcDF = 
        sparkSession.read().jdbc(CONNECTION_URL, dbTable, "emp_no", 10001, 499999, 10, connectionProperties);

*代码在java中

来源:Loading database data using Spark 2.0 Data Sources API

【讨论】:

非常感谢!它必须是java代码吗?我在 python 代码的 dbtable 参数中传递 SQL 查询,得到一个错误“无效的表名”。 非常感谢,我会尝试一点java。 @AndyNie:你可以从我提到的链接中获取帮助【参考方案2】:

另一种方法是在 Oracle 上创建视图,以便您可以在数据库本身中处理 Oracle 特定的数据类型。

【讨论】:

以上是关于如何通过 Spack JDBC 选择特定列?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 JDBC 显示 Informix sysprocedures.paramtypes 列?

如何通过对不同列使用可重用代码在 JDBC 中编写一个更新查询(更新 1 列)?

通过选择 Pandas 中的其他列来更新条件列值

使用外部 MPI 接口安装 spack 包

JDBC - SQLITE 选择变量

SQLite 无法通过 JDBC 和 jOOQ 在 SELECT 中找到现有列