【问题标题】:import spark.implicits._ is unused导入 spark.implicits._ 未使用
【发布时间】:2016-09-30 00:26:52
【问题描述】:

我有一个使用以下代码创建的数据框

val SomeCsv = spark.read.option("header", "true").
  csv(conf.getString("data.path.Somecsv")).toDF()

我有一个看起来像这样的函数(到目前为止什么也没做)。

def cleanUp(data: sql.DataFrame): sql.DataFrame = {
  data.map({
    doc =>
      (
        doc

        )
  })
}

编译时出现错误:

“无法找到存储在数据集中的类型的编码器。导入 spark.implicits._ 支持原始类型(Int、String 等)和产品类型(案例类)”

我已经按照其他帖子的建议设置了导入语句。

val spark = SparkSession.builder...etc
import spark.implicits._

导入语句被 IntelliJ 标记为未使用

我的猜测是

1.) csv 加载代码使用了一些编码器,它是一个对象而不是原语。

2.) 和/或我需要在我的函数语句中指定数据帧的数据类型,就像你对 RDD 所做的那样?我在 Spark 文档中找不到这方面的任何信息。

编辑

如果我改为使用

val SomeOtherCsv = SomeCsv.map(t => t(0) + "foobar")

import 语句触发,一切编译良好。我现在的问题是相同数据上的方法版本(以上)仍然中断。

EDIT2

这里是 MCVE

import org.apache.spark._
import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql._/*statement unused*/
import com.typesafe.config.ConfigFactory

object main {
  def main(args: Array[String]) = {
    /*load spark conf*/
    val sparkConf = new SparkConf().setAppName("main")
    val sc = new SparkContext(sparkConf)
    /*load configure tool*/
    val conf = ConfigFactory.load()
    /*load spark session*/
    val spark = SparkSession.builder.
      master("local")
      .appName("tester")
      .getOrCreate()
    import spark.implicits._/* is used for val ProcessedGenomeCsv but not testFunction*/
    /*load genome csv as dataframe, conf.getString points to application.conf which contains a local directory for the csv file*/
    val GenomeCsv = spark.read.option("header", "true").
      csv(conf.getString("data.path.genomecsv")).toDF()
    /*cleans up segment names in csv so the can be matched to amino data*/
    def testFunctionOne(data: sql.DataFrame): sql.DataFrame = {/* breaks with import spark.implicits._ error, error points to next line "data.map"*/
      data.map({
        doc =>
          (
            doc

            )
      })
    }
    val ProcessedGenomeCsv = GenomeCsv.map(t => t(12) + "foobar")/* breaks when adding sqlContext and sqlContext.implicits._, is fine otherwise*/
    val FunctionProcessedGenomCsv = testFunctionOne(GenomeCsv)
    ProcessedGenomeCsv.take(1).foreach(println)
    FunctionProcessedGenomCsv.take(1).foreach(println)
  }
}

【问题讨论】:

  • 您能否提供一个 MVCE,以便我们尝试提供帮助? stackoverflow.com/help/mcve
  • 已添加,谢谢。我是新手
  • 您是否尝试过在 def 中添加导入?

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


【解决方案1】:

你想要 sqlContext.implicits._

您想在创建 sqlContext 后声明它(它已经在 spark-shell 中为您创建,但在 spark-submit 中没有)

你希望它看起来像这样:

object Driver {
    def main(args: Array[String]):Unit = {
        val spark_conf =
          new SparkConf()
            .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
            .setAppName("Spark Tika HDFS")
        val sc = new SparkContext(spark_conf)

        import sqlContext.implicits._

        val df = ....

    }
}

【讨论】:

  • 使用 import sqlContext.implicits._ 并不能修复编译错误,现在还破坏了我在上面添加的 csv.map 函数。我相信这是因为 sqlContext 是一个不推荐使用的方法,有利于 SparkSession(我正在使用)我刚刚注意到内联 csv.map 函数现在触发了 import spark.implicits._ 语句,所以这很好。当我把它写成一个方法时它就不起作用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多