将数据帧写入Spark的Teradata表

时间:2016-11-15 10:10:36

标签: apache-spark apache-spark-sql teradata spark-dataframe

到目前为止,我能够使用Teradata jdbc连接器为Teradata读取数据帧。 阅读语法如下:

if(($time_out_db>=$time_out) && ($time_enter<=$time_enter_db)){
    echo "Time is in between"
}elseif(($time_out_db>=$time_out) || ($time_enter<=$time_enter_db)){
    echo "Either one of the time_out or time_enter is in the range";
}

其中hc = hiveContext,url = teradata的连接URL

我想将数据框保存到Teradata表。我尝试通过将dbtable更改为insert语句

来使用上述语法
val df = hc.read.format("jdbc").options(
  Map(
    "url" -> url,
    "dbtable" -> (sel * from tableA) as data,
    "driver" ->   "com.teradata.jdbc.TeraDriver"
  )
).load()

但上述陈述给了我一个错误:

 val df = hc.read.format("jdbc").options(
  Map(
    "url" -> url,
    "dbtable" -> (insert into db.tabA  values (1,2,3)) as data,
    "driver" ->   "com.teradata.jdbc.TeraDriver"
  )
).load()

我想在Spark中将数据帧保存到Teradata,这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

AFAIK as data不正确,对我来说似乎仍然是正确的。

"dbtable" -> (insert into db.tabA  values (1,2,3)) as data,

"dbtable" -> (insert into db.tabA  values (1,2,3)) ,

下面应该解决任何麻烦。

val df = hc.read.format("jdbc").options(
  Map(
    "url" -> url,
    "dbtable" -> (insert into db.tabA  values (1,2,3)),
    "driver" ->   "com.teradata.jdbc.TeraDriver"
  )
).load()

答案 1 :(得分:0)

我能够使用Scalikejdbc将数据写入Teradata表。 我使用批量更新来存储结果。

使用ScalikeJdbc插入批处理行的示例代码:

 DB localTx { implicit session =>
  val batchParams: Seq[Seq[Any]] = (2001 to 3000).map(i => Seq(i, "name" + i))
  withSQL {
    insert.into(Emp).namedValues(column.id -> sqls.?, column.name -> sqls.?)
  }.batch(batchParams: _*).apply()
}