我在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.NullPointerException在 org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:93) 在 org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:518) 在 org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:215) ... 48消失
我更改了url选项,使其类似于jdbc url,并运行以下命令:
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.NullPointerException在 org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:93) 在 org.apache.spark.sql.execution.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版本15 Spark版本2
答案 0 :(得分:1)
将jdbc_url和dbtable更改为以下内容
.option("url","jdbc:teradata//organization.td.intranet/Database=td_s_zm_brainsdb)
.option("dbtable","emp")
还要注意,在teradata中,没有行锁,因此上面将创建一个表锁。也就是说,效率不高-无法从sparkJDBC进行并行写入。
teradata的本机工具-快速加载器/ bteq组合将起作用。 另一个选项-需要进行复杂的设置是Teradata查询网格-这非常快-在后台使用Presto。
答案 1 :(得分:0)
下面的代码在从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中创建数据框。
下面用于将数据写回数据库的语句,
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()
答案 2 :(得分:0)
我发现了实际问题。 JDBC URL应该采用以下形式: val jdbcUrl = s“ jdbc:teradata:// $ {jdbcHostname} / database = $ {jdbcDatabase},user = $ {jdbcUsername},password = $ {jdbcPassword}”
这是导致异常的原因,因为我没有提供用户名和密码。