在Spark中将数据帧写入Teradata



我在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}"

它导致了一个异常,因为我没有提供用户名和密码。

相关内容

  • 没有找到相关文章

最新更新