Запись данных в Teradata в Spark - PullRequest
0 голосов
/ 29 января 2019

У меня есть значения в фрейме данных, и я создал структуру таблицы в 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.ap.sql.DataFrameWriter.save (DataFrameWriter.scala: 215) ... 48 elided

Я изменил параметр URL, чтобы сделать его похожим на URL-адрес jdbc, и запустил следующую команду:

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 elided

Я включил следующие банки:

with --jars option 
tdgssconfig-16.10.00.03.jar
terajdbc4-16.10.00.03.jar
teradata-connector-1.2.1.jar

Versiот Teradata 15 Spark версия 2

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Ниже приведен код, полезный при чтении данных из таблицы 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()
0 голосов
/ 30 января 2019

Я нашел актуальную проблему.URL JDBC должен иметь следующую форму: - val jdbcUrl = s "jdbc: teradata: // $ {jdbcHostname} / database = $ {jdbcDatabase}, пользователь = $ {jdbcUsername}, пароль = $ {jdbcPassword}"

Это вызывало исключение, потому что я не указал имя пользователя и пароль.

0 голосов
/ 29 января 2019

Измените jdbc_url и dbtable на следующие


.option("url","jdbc:teradata//organization.td.intranet/Database=td_s_zm_brainsdb)
.option("dbtable","emp") 

Также обратите внимание, что в teradata нет блокировок строк, поэтому приведенное выше создаст блокировку таблицы.то есть это не будет эффективным - параллельная запись из sparkJDBC невозможна.

Будут работать нативные инструменты комбинаций teradata - fastloader / bteq.Другой вариант, требующий сложной настройки, - это Teradata Query Grid - это очень быстро - использует Presto за кулисами.

...