我是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);
答案 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所示?