Apache Spark - 使用JDBC驱动程序

时间:2016-05-18 14:02:49

标签: scala apache-spark memsql

我在尝试保存从 Apache Spark temp DataFrame 加载到的Apache Spark table时遇到问题分布式 MemSQL database 。 诀窍是暂时不能使用MemSQLContext连接器。所以我使用 JDBC driver

这是我的代码

//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_SUPPLIER table与临时fields具有完全相同的datatypestable,且设置为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)。
  3. 有人遇到同样的问题吗?

1 个答案:

答案 0 :(得分:1)

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