在Spark中将数据帧写入Teradata

时间:2019-01-29 14:50:46

标签: scala apache-spark hadoop apache-spark-sql 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.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

3 个答案:

答案 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中创建数据框。

下面用于将数据写回数据库的语句,

将数据保存到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()

答案 2 :(得分:0)

我发现了实际问题。 JDBC URL应该采用以下形式: val jdbcUrl = s“ jdbc:teradata:// $ {jdbcHostname} / database = $ {jdbcDatabase},user = $ {jdbcUsername},password = $ {jdbcPassword}”

这是导致异常的原因,因为我没有提供用户名和密码。