我是apache spark的新手,我想在java中使用spark将模型类插入到mysql Db中。
我尝试使用以下代码。但它不能正常工作。
模型:
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private int id;
private String name;
private String email;
private String city;
private String country;
private String ip;
private static StructType structType = DataTypes.createStructType(new StructField[] {
DataTypes.createStructField("id", DataTypes.IntegerType, false),
DataTypes.createStructField("name", DataTypes.StringType, true),
DataTypes.createStructField("email", DataTypes.StringType, true),
DataTypes.createStructField("city", DataTypes.StringType, true),
DataTypes.createStructField("country", DataTypes.StringType, true),
DataTypes.createStructField("ip", DataTypes.StringType, true)
});
//getters & setters
MyApp的:
public class MyApp {
private static final String MYSQL_USERNAME = "root";
private static final String MYSQL_PWD = "";
private static final String MYSQL_CONNECTION_URL = "jdbc:mysql://localhost:3306/sample?user=" + MYSQL_USERNAME + "&password=" + MYSQL_PWD;
private static final JavaSparkContext sc =
new JavaSparkContext(new SparkConf().setAppName("SparkSaveToDb").setMaster("local[*]"));
private static final SQLContext sqlContext = new SQLContext(sc);
public static void main(String[] args) {
//Sample data-frame loaded from a JSON file
try{
List<User> list = new ArrayList<User>();
User us = new User();
us.setId(1);
us.setName("Ravi");
us.setEmail("abc.xyz0@gmail.com");
us.setCity("hyderabad");
us.setCountry("India");
us.setIp("127.0.0.1");
list.add(us);
//Creating RDD
JavaRDD<User> personsRDD = sc.parallelize(list);
DataFrame userDf = sqlContext.createDataFrame(personsRDD, User.class);
//JdbcUtils.saveTable(userDf, MYSQL_CONNECTION_URL, "users", prop);
userDf.write().mode(SaveMode.Append).jdbc(MYSQL_CONNECTION_URL, "users", new java.util.Properties());
}catch(Exception e){
System.out.println(e);
System.exit(0);
}
}
}
当我运行上面的代码时,我得到以下异常
java.sql.SQLException: Incorrect integer value: 'hyderabad' for column 'id' at row 1**
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
有谁能告诉我如何解决这个问题并插入到mysql DB中。提前致谢
答案 0 :(得分:0)
首先
如果您的AUTO_INCREMENT
符合以下条件,那么您的表格会id
:
id int AUTO_INCREMENT
然后您不需要设置ID us.setId(1);
,这可能会产生问题,请考虑您已经使用此id = 1
,所以当您放置us.setId(1);
时是冲突,所以不要使用us.setId(1);
否则,如果此ID不存在,您应首先检查。
<强>第二强>
不正确的整数值:&#39; hyderabad&#39;对于列&#39; id&#39;在第1行
此错误意味着您将'hyderabad'
字符串设置为您的类型为整数的id,因此您正在做这样的事情:
如果这是你的表:
create table mytable(
id int,
....
);
然后你的查询就像这样:
Insert into mytable (id, ...) values ('hyderabad', ...);
这不正确,所以检查您的插入查询可能只是改变了属性的顺序。