我在dataframe中有值,并且我在Teradata中创建了一个表结构。我的要求是将数据帧加载到Teradata。但我得到了错误:
我已经尝试了以下代码:
df.write.format("jdbc")
.option("driver","com.teradata.jdbc.TeraDriver")
.option("url","organization.td.intranet")
.option("dbtable",s"select * from td_s_zm_brainsdb.emp")
.option("user","userid")
.option("password","password")
.mode("append")
.save()
我得到一个错误:
java.lang.NullPointerExceptionorg.apache.spark.sql.exexecution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:93)在org.apache.spark.sql.exexecution.datasources.DataSource.write(DataSource.scala:518)在org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:215)…48消隐
我更改了url选项,使其类似于jdbcurl,并运行了以下命令:
df.write.format("jdbc")
.option("driver","com.teradata.jdbc.TeraDriver")
.option("url","jdbc:teradata//organization.td.intranet,CHARSET=UTF8,TMODE=ANSI,user=G01159039")
.option("dbtable",s"select * from td_s_zm_brainsdb.emp")
.option("user","userid")
.option("password","password")
.mode("append")
.save()
我仍然得到错误:
java.lang.NullPointerExceptionorg.apache.spark.sql.exexecution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:93)在org.apache.spark.sql.exexecution.datasources.DataSource.write(DataSource.scala:518)在org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:215)…48消隐
我已经包括了以下罐子:
with --jars option
tdgssconfig-16.10.00.03.jar
terajdbc4-16.10.00.03.jar
teradata-connector-1.2.1.jar
Teradata版本15Spark版本2
将jdbc_url和dbtable更改为以下
.option("url","jdbc:teradata//organization.td.intranet/Database=td_s_zm_brainsdb)
.option("dbtable","emp")
另外请注意,在teradata中,没有行锁,因此上面将创建一个表锁。也就是说,它将不高效——从sparkJDBC进行并行写入是不可能的。
teradata的本地工具-fastloader/bteq组合将起作用。另一个需要复杂设置的选项是Teradata查询网格,速度极快,在后台使用Presto。
以下代码在从Teradata表、读取数据时很有用
df = (spark.read.format("jdbc").option("driver", "com.teradata.jdbc.TeraDriver")
.option("url", "jdbc:teradata//organization.td.intranet/Database=td_s_zm_brainsdb")
.option("dbtable", "(select * from td_s_zm_brainsdb.emp) AS t")
.option("user", "userid")
.option("password", "password")
.load())
这将在Spark中创建数据帧。
对于将数据写回数据库,下面是语句,
将数据保存到JDBC源
jdbcDF.write
.format("jdbc")
.option("url", "jdbc:teradata//organization.td.intranet/Database=td_s_zm_brainsdb")
.option("dbtable", "schema.tablename")
.option("user", "username")
.option("password", "password")
.save()
JDBC Url应采用以下形式:
val jdbcUrl = s"jdbc:teradata://${jdbcHostname}/database=${jdbcDatabase},user=${jdbcUsername},password=${jdbcPassword}"
它导致了一个异常,因为我没有提供用户名和密码。