当我尝试通过Spark 2.0中的map迭代DataFrame值时,将发生以下错误
******错误:无法找到存储在数据集中的类型的编码器。导入spark.implicits支持原始类型(Int,String等)和产品类型(case类)。在将来的版本中将添加对序列化其他类型的支持。 resDf_upd.map(row => {******
代码是
import org.apache.spark.SparkContext
import org.apache.spark.sql.{SQLContext, SparkSession, SaveMode, Row}
import com.typesafe.config.ConfigFactory
import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder
import org.apache.spark.sql.Encoder
object TestProg {
def main(args: Array[String]){
val sc = new SparkContext( "local", "Test Program", "/usr/local/spark", Nil, Map())
val sqlContext = new SQLContext(sc)
val config = ConfigFactory.load("test.conf")
val db1_prop = new java.util.Properties
db1_prop.put("user", config.getString("db1.usr"))
db1_prop.put("password", config.getString("db1.pwd"))
db1_prop.put("driver", config.getString("db1.driver"))
val db1_url = config.getString("db1.url")
val db1_type = "jdbc"
val spark = SparkSession
.builder()
.appName("Session Program")
.config("spark.some.config.option", "some-value")
.getOrCreate()
var empDf = sqlContext.read.format(db1_type).jdbc(db1_url,"employee",db1_prop)
empDf.createOrReplaceTempView("emp")
**val resDf_upd = sqlContext.sql("select * from emp")
resDf_upd.map(row => {
val row1 = row.getAs[String](1)
val make = if (row1.toLowerCase == "Usr3") "User3" else row1
Row(row(0),make,row(2))
}).collect().foreach(println)**
}
}
NetBeans提示:[“没有足够的方法映射参数:(隐式证据$ 7:org.apache.spark.sql.Encoder [org.apache.spark.sql.Row])org.apache.spark.sql.Dataset [org.apache.spark.sql.Row]。 未指定的值参数证据$ 7。
无法找到存储在数据集中的类型的编码器。导入spark.implicits支持原始类型(Int,String等)和产品类型(case类)。在将来的版本中将添加对序列化其他类型的支持。“]
在Spark2.0.0文档中无法使用DataFrames类:https://spark.apache.org/docs/2.0.0/api/java/index.html
DataFrames类使用的是Spark2.0.0示例文档: https://spark.apache.org/docs/latest/sql-programming-guide.html#inferring-the-schema-using-reflection