Apache Spark读取Teradata表时提示找不到指定列问题求助
问题根因
你遇到的报错核心是Teradata JDBC驱动的默认列名返回规则导致的不匹配:
- Teradata的表结构支持为每个字段设置
ColumnTitle(列展示标题),你查询元数据的结果可以看到login_date字段的标题就是Login Date - Teradata JDBC驱动默认开启了
COLUMN_NAME_REPORT=LABEL配置,会把字段的ColumnTitle作为返回给上层的列名,而非实际存储的字段名login_date - Spark读取JDBC数据源时会自动读取驱动返回的列名做映射,驱动返回的带空格的
Login Date和实际查询中的字段名login_date无法匹配,最终触发列不存在的报错。
解决方案
有三种可行的修复方案,按优先级从高到低排列:
- 方案1:修改JDBC连接URL,添加
COLUMN_NAME_REPORT=NAME参数,强制驱动返回实际字段名作为列名,这是最通用的修复方式,修改后的URL如下:
jdbc:teradata://127.0.0.1/database=test, TMODE=TERA, COLUMN_NAME_REPORT=NAME
- 方案2:编写子查询时显式给字段指定别名,保证返回的列名和预期一致:
.option("dbtable", "(SELECT TOP 5 user_id, active_flag, login_date AS login_date FROM test.users) AS tmp")
- 方案3:提前自定义Spark读取的Schema,指定每个字段的名称和类型,避免Spark自动从JDBC驱动拉取列名信息。
内容的提问来源于stack exchange,提问作者Finkelson
相关产品推荐
相关产品推荐

