数据帧数据插入MySQL表

时间:2018-05-21 10:36:27

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

我是Spark SQL新手,

我正在使用DataFrame,其架构如下

fields.add(DataTypes.createStructField(fieldName[0], DataTypes.StringType, true));
fields.add(DataTypes.createStructField(fieldName[1], DataTypes.StringType, true));
fields.add(DataTypes.createStructField(fieldName[2], DataTypes.DoubleType, true));
fields.add(DataTypes.createStructField(fieldName[3], DataTypes.StringType, true));

我将数据覆盖到MySQL中,MySQL Schema如下所示。

Field[0], VARCHAR(20)
Field[1], VARCHAR(20)
Field[2], DOUBLE
Field[3], DATETIME

无论何时在MySQL表中写入数据,它都会将模式写入Text,Text,Double,Text。

我不希望架构应该更改,它应该插入数据而不更改MySQL中的表架构,请建议。

我正在使用spark-core_2.10版本1.6,spark-sql_2.10版本1.6

我尝试过投射值,但没有工作

DataFrame intoSql;
intoSql.selectExpr("cast(Field1 as java.sql.Types.VARCHAR) Field1");
intoSql.selectExpr("cast(Field2 as java.sql.Types.VARCHAR) Field2");
intoSql.selectExpr("cast(Field3 as java.sql.Types.TIMESTAMP) Field3");
intoSql.write().format("TableNameinMYSQL").mode(SaveMode.Overwrite).jdbc(url, tableName, Properties);

2 个答案:

答案 0 :(得分:0)

您应该设置truncate option

  

truncate (default false):使用TRUNCATE TABLE而不是DROP TABLE。

     

如果出现故障,用户应关闭truncate选项以再次使用DROP TABLE。此外,由于TRMSATE TABLE在DBMS之间的不同行为,使用它并不总是安全的。 MySQLDialect,DB2Dialect,MsSqlServerDialect,DerbyDialect和OracleDialect支持此功能,而PostgresDialect和默认JDBCDirect则不支持。对于未知和不受支持的JDBCDirect,将忽略用户选项truncate。   到true

intoSql.write()
  .option("truncate", "true")
  .mode(SaveMode.Overwrite)
  .jdbc(url, tableName, Properties);

答案 1 :(得分:0)

也许您可以尝试使用MetadataBuilder和createTableColumnTypes属性,如此测试用例https://github.com/apache/spark/blob/master/sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCWriteSuite.scala#L454所示?