我在尝试保存从 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
具有完全相同的datatypes
和table
,且设置为primary key
。
仅供参考,这里有一些线索:
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)
);`
suppliers.write
语句已经运行一次,但数据随后在DataFrame
中加载了sqlContext.read.jdbc
命令,而不是sqlContext.sql
(数据存储在远程database
而不是Apache Spark本地临时table
)。有人遇到同样的问题吗?
答案 0 :(得分:1)
运行create table或运行suppliers.write代码时是否收到该错误?这是一个只有在创建表时才能得到的错误。因此,如果您在运行suppliers.write时遇到它,您的代码可能会尝试创建并写入新表,而不是您之前创建的表。