2016-05-18 45 views
1

我目前所面临的一个问题,而试图挽救一个Apache星火DataFrame阿帕奇星火临时table加载到分布式MemSQL database MemSQL数据库。 诀窍是目前我不能使用MemSQLContext连接器。所以我使用JDBC driver阿帕奇星火 - 坚持错误数据框使用JDBC驱动程序


这里是我的代码

//store suppliers data from temp table into a dataframe 
val suppliers = sqlContext.read.table("tmp_SUPPLIER") 
//append data to the target table 
suppliers.write.mode(SaveMode.Append).jdbc(url_memsql, "R_SUPPLIER", prop_memsql) 

这里是(在suppliers.write声明中发生的历史)的错误信息

java.sql.SQLException: Distributed tables must either have a PRIMARY or SHARD key. 

注意R_SUPPLIERtable正好有比临时table相同fieldsdatatypes并具有primary key集。


仅供参考,这里有一些线索

  1. R_SUPPLIER script

    `CREATE TABLE R_SUPPLIER 
    (
         SUP_ID INT NOT NULL PRIMARY KEY, 
         SUP_CAGE_CODE CHAR(5) NULL, 
         SUP_INTERNAL_SAP_CODE CHAR(5) NULL, 
         SUP_NAME VARCHAR(255) NULL, 
         SHARD KEY(SUP_ID) 
    );` 
    
  2. suppliers.write语句一次得手,但是然后数据被加载到DataFrame中,其中sqlContext.read.jdbc命令而不是sqlContext.sql(数据存储在远端database而不是在Apache Spark本地临时table中)。

没有人面临着同样的问题,好吗?

回答

1

当您运行create table或运行suppliers.write代码时,您是否收到该错误?这是您创建表时只能得到的错误。因此,如果在运行suppliers.write时触及它,代码可能会尝试创建并写入新表,而不是您之前创建的表。

+0

感谢您花时间回答我。当'suppliers.write'语句被调用**时,它正在发生**。我已经使用过这段代码,它的工作原理,但DataFrame加载了一个'sqlContext.read.jdbc'(数据存储在一个遥远的'数据库'而不是一个Apache Spark临时表')... – KrasshX

+0

我更新了这个问题。 – KrasshX

+0

你可以找出针对memsql运行的查询是否会产生该错误?您可以通过设置'general_log = on' http://docs.memsql.com/docs/trace-log#section-logging-queries来尝试使用查询日志记录。我怀疑JDBC连接器正在做一些与预期不同的事情。 –