如何使用spark和java在mysql中插入模型

时间:2017-02-10 14:18:28

标签: java mysql apache-spark apache-spark-sql

我是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中。提前致谢

1 个答案:

答案 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', ...);

这不正确,所以检查您的插入查询可能只是改变了属性的顺序。