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_SUPPLIER
table
正好有比临时table
相同fields
和datatypes
并具有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
中)。
没有人面临着同样的问题,好吗?
感谢您花时间回答我。当'suppliers.write'语句被调用**时,它正在发生**。我已经使用过这段代码,它的工作原理,但DataFrame加载了一个'sqlContext.read.jdbc'(数据存储在一个遥远的'数据库'而不是一个Apache Spark临时表')... – KrasshX
我更新了这个问题。 – KrasshX
你可以找出针对memsql运行的查询是否会产生该错误?您可以通过设置'general_log = on' http://docs.memsql.com/docs/trace-log#section-logging-queries来尝试使用查询日志记录。我怀疑JDBC连接器正在做一些与预期不同的事情。 –