java.lang.IllegalArgumentException: 无法为数组 <string> 获取 JDBC 类型
java.lang.IllegalArgumentException: Can't get JDBC type for array<string>
我想将输出数据导入mysql数据库,但是出现如下错误,我不会将数组转换成想要的字符串类型,可以帮帮我吗?
val Array(trainingData, testData) = msgDF.randomSplit(Array(0.9, 0.1))
val pipeline = new Pipeline().setStages(Array(labelIndexer, word2Vec, mlpc, labelConverter))
val model = pipeline.fit(trainingData)
val predictionResultDF = model.transform(testData)
val rows = predictionResultDF.select("song", "label", "predictedLabel")
val df = rows.registerTempTable("song_classify")
val sqlcommand = "select * from song_classify"
val prop = new java.util.Properties
prop.setProperty("user", "root")
prop.setProperty("password", "123")
sqlContext.sql(sqlcommand)
.write.mode(SaveMode.Append).jdbc("jdbc:mysql://localhost:3306/yuncun", "song_classify", prop)
sc.stop
这是控制台输出
Exception in thread "main" java.lang.IllegalArgumentException: Can't get JDBC type for array<string>
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$getJdbcType.apply(JdbcUtils.scala:148)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$getJdbcType.apply(JdbcUtils.scala:148)
at scala.Option.getOrElse(Option.scala:121)
我想在mysql数据库中存储以下数据
+---------+-----+--------------+
| song|label|predictedLabel|
+---------+-----+--------------+
| [一吻天荒]| 1| 2|
| [有一点动心]| 1| 2|
| [有你真好]| 1| 2|
| [永远不分开]| 1| 2|
|[我要我们在一起]| 2| 2|
| [后来的我们]| 2| 2|
| [喜欢]| 2| 2|
| [夜车]| 2| 2|
| [寂寞疯了]| 2| 2|
| [拥抱]| 2| 2|
| [方圆几里]| 2| 2|
| [时间煮雨]| 2| 2|
| [爱上你]| 2| 2|
| [献世]| 2| 2|
| [说散就散]| 2| 2|
+---------+-----+--------------+
但是第一列是数组,所以程序报错
你能帮我提出一个改变方案吗?谢谢
在写入数据库之前,您需要删除类型为 array
的 columns
。
您可以为列类型 array
创建一个逗号分隔的 string
作为
val datafrme = ??
import org.apache.spark.sql.functions._
dataframe.withColumn("song", concat_ws(",", $"song"))
// then write to database
.write.mode(SaveMode.Append).jdbc("url", "song_classify", prop)
concat_ws
创建一个字符串 array
中的值,并提供分隔符。
希望对您有所帮助!
我想将输出数据导入mysql数据库,但是出现如下错误,我不会将数组转换成想要的字符串类型,可以帮帮我吗?
val Array(trainingData, testData) = msgDF.randomSplit(Array(0.9, 0.1))
val pipeline = new Pipeline().setStages(Array(labelIndexer, word2Vec, mlpc, labelConverter))
val model = pipeline.fit(trainingData)
val predictionResultDF = model.transform(testData)
val rows = predictionResultDF.select("song", "label", "predictedLabel")
val df = rows.registerTempTable("song_classify")
val sqlcommand = "select * from song_classify"
val prop = new java.util.Properties
prop.setProperty("user", "root")
prop.setProperty("password", "123")
sqlContext.sql(sqlcommand)
.write.mode(SaveMode.Append).jdbc("jdbc:mysql://localhost:3306/yuncun", "song_classify", prop)
sc.stop
这是控制台输出
Exception in thread "main" java.lang.IllegalArgumentException: Can't get JDBC type for array<string>
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$getJdbcType.apply(JdbcUtils.scala:148)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$org$apache$spark$sql$execution$datasources$jdbc$JdbcUtils$$getJdbcType.apply(JdbcUtils.scala:148)
at scala.Option.getOrElse(Option.scala:121)
我想在mysql数据库中存储以下数据
+---------+-----+--------------+
| song|label|predictedLabel|
+---------+-----+--------------+
| [一吻天荒]| 1| 2|
| [有一点动心]| 1| 2|
| [有你真好]| 1| 2|
| [永远不分开]| 1| 2|
|[我要我们在一起]| 2| 2|
| [后来的我们]| 2| 2|
| [喜欢]| 2| 2|
| [夜车]| 2| 2|
| [寂寞疯了]| 2| 2|
| [拥抱]| 2| 2|
| [方圆几里]| 2| 2|
| [时间煮雨]| 2| 2|
| [爱上你]| 2| 2|
| [献世]| 2| 2|
| [说散就散]| 2| 2|
+---------+-----+--------------+
但是第一列是数组,所以程序报错
你能帮我提出一个改变方案吗?谢谢
在写入数据库之前,您需要删除类型为 array
的 columns
。
您可以为列类型 array
创建一个逗号分隔的 string
作为
val datafrme = ??
import org.apache.spark.sql.functions._
dataframe.withColumn("song", concat_ws(",", $"song"))
// then write to database
.write.mode(SaveMode.Append).jdbc("url", "song_classify", prop)
concat_ws
创建一个字符串 array
中的值,并提供分隔符。
希望对您有所帮助!