【问题标题】:Issue with toDF, Value toDF is not a member of org.apache.spark.rdd.RDDtoDF 的问题,值 toDF 不是 org.apache.spark.rdd.RDD 的成员
【发布时间】:2018-10-01 16:21:18
【问题描述】:

我为错误“toDF 的值不是 org.apache.spark.rdd.RDD 的成员”附加了代码 sn-p。我正在使用 scala 2.11.8 和 spark 2.0.0。 你能帮我解决 API toDF() 的这个问题吗?

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkConf
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.functions._

object HHService {
    case class Services(
    uhid:String,
    locationid:String,
    doctorid:String,
    billdate:String,
    servicename:String,
    servicequantity:String,
    starttime:String,
    endtime:String,
    servicetype:String,
    servicecategory:String,
    deptname:String
    )

    def toService = (p: Seq[String]) => Services(p(0), p(1),p(2),p(3),p(4),p(5),p(6),p(7),p(8),p(9),p(10))

    def main(args: Array[String]){
        val warehouseLocation = "file:${system:user.dir}/spark-warehouse"
        val spark = SparkSession
            .builder
            .appName(getClass.getSimpleName)
            .config("spark.sql.warehouse.dir", warehouseLocation)
        .enableHiveSupport()
            .getOrCreate()
        val sc = spark.sparkContext 

        val sqlContext = spark.sqlContext;

        import spark.implicits._
        import sqlContext.implicits._

        val hospitalDataText = sc.textFile("D:/Books/bboks/spark/Intellipaat/Download/SparkHH/SparkHH/services.csv")
        val header = hospitalDataText.first()
        val hospitalData= hospitalDataText.filter(a => a!= header)
        //val HData = hospitalData.map(_.split(",")).map(p=>Services(p(0), p(1),p(2),p(3),p(4),p(5),p(6),p(7),p(8),p(9),p(10)))
        val HData = hospitalData.map(_.split(",")).map(toService(_))

        val hosService=HData.toDF()
    }

}

【问题讨论】:

    标签: dataframe apache-spark-sql


    【解决方案1】:

    1] 需要如下获取sqlContext。

    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    import sqlContext.implicits._
    

    这解决了我的问题。前面的代码 sn -p 用于获取 sqlcontext。 val sqlContext = spark.sqlContext (这种方式与 spark-shell 一起使用)

    2] 案例类需要超出方法。大多数博客中也提到了这一点。

    【讨论】:

    • case class need to be out of method. 为我工作
    【解决方案2】:

    在 DataBricks 中使用笔记本将我的代码转换为简单函数时遇到了同样的问题。必须将类声明为函数,并且一切正常:

    %scala
    
    case class className(param1 : String,
                          param2 : String,
                          ...
                          lastoaram : Double)
    
    def myFunction(params) = {
    a lot of code 
    ...
    var myVarBasedOnClasseDefinition = Seq(myVarBasedOnClasseDefinition ("init","init","init",0.0,0.0,"init",0.0))
    for(iteration <- iterator) myVarBasedOnClasseDefinition = myVarBasedOnClasseDefinition ++ additionnalSequence
    display(myVarBasedOnClasseDefinition.toDF())
    }
    

    希望这会有所帮助,因为“案例类需要超出方法”这句话在我的搜索开始时似乎并没有真正适用于我的案例,使用类似程序的代码一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 2020-01-20
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多