Spark:创建 DataFrame 会出现异常

Posted

技术标签:

【中文标题】Spark:创建 DataFrame 会出现异常【英文标题】:Spark: Creating DataFrame gives exception 【发布时间】:2017-02-27 12:46:32 【问题描述】:

我正在尝试使用 spark sqlContext 创建 DataFrame。我使用了 spark 1.6.3 和 scala 2.10.5。下面是我创建 DataFrames 的代码。

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext
import com.knoldus.pipeline.KMeansPipeLine

object SimpleApp

    def main(args:Array[String])

    val conf = new SparkConf().setAppName("Simple Application")
    val sc = new SparkContext(conf)
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)

    import sqlContext.implicits._

    val kMeans = new KMeansPipeLine()
     val df = sqlContext.createDataFrame(Seq(
        ("a@email.com", 12000,"M"),
        ("b@email.com", 43000,"M"),
        ("c@email.com", 5000,"F"),
        ("d@email.com", 60000,"M")
      )).toDF("email", "income","gender")

    val categoricalFeatures = List("gender","email")
    val numberOfClusters = 2
    val iterations = 10
    val predictionResult = kMeans.predict(sqlContext,df,categoricalFeatures,numberOfClusters,iterations)
   

它给了我以下例外。我在做什么错误?谁能帮我解决这个问题?

 Exception in thread "main" java.lang.NoSuchMethodError:
    org.apache.spark.sql.SQLContext.createDataFrame(Lscala/collection/Seq;Lscala/ref lect/api/TypeTags$TypeTag;)Lorg/apache/spark/sql/Dataset;
    at SimpleApp$.main(SimpleApp.scala:24)
    at SimpleApp.main(SimpleApp.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我使用的依赖有:

scalaVersion := "2.10.5" 
libraryDependencies ++= Seq( 
 "org.apache.spark" % "spark-core_2.10" % "2.0.0" % "provided", 
 "org.apache.spark" % "spark-sql_2.10" % "2.0.0" % "provided", 
 "org.apache.spark" % "spark-mllib_2.10" % "2.0.0" % "provided", 
 "knoldus" % "k-means-pipeline" % "0.0.1" )

【问题讨论】:

你的代码很适合我。我猜您的 Spark 二进制文件是使用 Scala 2.11 编译的,因此它们无法使用 Spark 2.10 与您的代码一起运行,这与此处描述的问题相反:***.com/questions/27728731/… @TzachZohar 我该如何解决这个问题? 首先 - 您的依赖项表明您使用的是 Spark 2.0.0 而不是上面所述的 1.6.3。 Spark 2.0.0 默认使用 Scala 2.11,据我所知,如果你想将它与 Scala 2.10 一起使用,你必须自己构建它,请参阅spark.apache.org/docs/latest/…。所以 - 要么使用 Scala 2.11,要么使用根据这些说明编译的 Spark 版本。 【参考方案1】:

正如我在您的 createDataFrame 中看到的,错过了第二个参数。此处描述的方法模式: https://spark.apache.org/docs/1.6.1/api/scala/index.html#org.apache.spark.sql.SQLContext@createDataFrame(org.apache.spark.api.java.JavaRDD,%20java.lang.Class)

你的情况是

def createDataFrame[A <: Product](data: Seq[A])(implicit arg0: scala.reflect.api.JavaUniverse.TypeTag[A]): DataFrame

:: Experimental :: 从产品的本地 Seq 创建一个 DataFrame。

或 将 Seq 转换为 List/RDD 并使用带 2 个参数的方法模式

【讨论】:

根本不正确 - 第二个参数是隐含的,因此不必显式提供它。考虑到正确的依赖关系,有问题的代码实际上工作 这是我的依赖项: scalaVersion := "2.10.5" libraryDependencies ++= Seq( "org.apache.spark" % "spark-core_2.10" % "2.0.0" % "provided", "org .apache.spark"%"spark-sql_2.10"%"2.0.0"%"提供","org.apache.spark"%"spark-mllib_2.10"%"2.0.0"%"提供", "knoldus" % "k-means-pipeline" % "0.0.1" ) 请将这些添加到问题中,而不是作为评论;

以上是关于Spark:创建 DataFrame 会出现异常的主要内容,如果未能解决你的问题,请参考以下文章

spark踩坑——dataframe写入hbase连接异常

spark创建空dataframe

如何打印 spark dataframe

Spark-Scala:使用异常处理将固定宽度线解析为 Dataframe Api

Spark SQL DataFrame - 异常处理

Spark SQL中的DataFrame的创建