DataFrame中的地图(Spark2.0)

时间:2016-09-15 14:29:39

标签: scala apache-spark apache-spark-sql spark-dataframe

当我尝试通过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

0 个答案:

没有答案