【问题标题】:could not find implicit value for parameter sparkSession找不到参数 sparkSession 的隐式值
【发布时间】:2019-03-15 13:44:44
【问题描述】:

我有一个笔记本,下面的代码会引发以下错误:

找不到参数 sparkSession 的隐含值

import org.apache.spark.sql.{SparkSession, Row, DataFrame}
import org.apache.spark.ml.clustering.KMeans

def createBalancedDataframe(df:DataFrame, reductionCount:Int)(implicit sparkSession:SparkSession) = {

    val kMeans = new KMeans().setK(reductionCount).setMaxIter(30)
    val kMeansModel = kMeans.fit(df)

    import sparkSession.implicits._
    kMeansModel.clusterCenters.toList.map(v => (v, 0)).toDF("features", "label")
  }

val balancedNonFraudDF = createBalancedDataframe(nonFraudDF, fraudCount.toInt)

错误:

Name: Compile Error
Message: <console>:82: error: could not find implicit value for parameter sparkSession: org.apache.spark.sql.SparkSession
       val balancedNonFraudDF = createBalancedDataframe(nonFraudDF, fraudCount.toInt)
                                                       ^

StackTrace: 

如果有人可以提供任何帮助,将不胜感激,非常感谢您。

更新:

感谢 Reddy 的输入,我将其更改为

val balancedNonFraudDF = createBalancedDataframe(nonFraudDF, fraudCount.toInt)(spark)

我收到以下错误:

Name: java.lang.IllegalArgumentException
Message: Field "features" does not exist.
Available fields: cc_num, trans_num, trans_time, category, merchant, amt, merch_lat, merch_long, distance, age, is_fraud
StackTrace: Available fields: cc_num, trans_num, trans_time, category, merchant, amt, merch_lat, merch_long, distance, age, is_fraud
  at org.apache.spark.sql.types.StructType$$anonfun$apply$1.apply(StructType.scala:267)
  at org.apache.spark.sql.types.StructType$$anonfun$apply$1.apply(StructType.scala:267)
  at scala.collection.MapLike$class.getOrElse(MapLike.scala:128)
  at scala.collection.AbstractMap.getOrElse(Map.scala:59)
  at org.apache.spark.sql.types.StructType.apply(StructType.scala:266)
  at org.apache.spark.ml.util.SchemaUtils$.checkColumnType(SchemaUtils.scala:40)
  at org.apache.spark.ml.clustering.KMeansParams$class.validateAndTransformSchema(KMeans.scala:93)
  at org.apache.spark.ml.clustering.KMeans.validateAndTransformSchema(KMeans.scala:254)
  at org.apache.spark.ml.clustering.KMeans.transformSchema(KMeans.scala:340)
  at org.apache.spark.ml.PipelineStage.transformSchema(Pipeline.scala:74)
  at org.apache.spark.ml.clustering.KMeans.fit(KMeans.scala:305)
  at createBalancedDataframe(<console>:45)

更新2:

featureDF.printSchema
root
 |-- cc_num: long (nullable = true)
 |-- category: string (nullable = true)
 |-- merchant: string (nullable = true)
 |-- distance: double (nullable = true)
 |-- amt: integer (nullable = true)
 |-- age: integer (nullable = true)
 |-- is_fraud: integer (nullable = true)
 |-- category_indexed: double (nullable = false)
 |-- category_encoded: vector (nullable = true)
 |-- merchant_indexed: double (nullable = false)
 |-- merchant_encoded: vector (nullable = true)
 |-- features: vector (nullable = true)

val fraudDF = featureDF
      .filter($"is_fraud" === 1)
      .withColumnRenamed("is_fraud", "label")
      .select("features", "label")

fraudDF.printSchema
root
 |-- cc_num: long (nullable = true)
 |-- trans_num: string (nullable = true)
 |-- trans_time: string (nullable = true)
 |-- category: string (nullable = true)
 |-- merchant: string (nullable = true)
 |-- amt: integer (nullable = true)
 |-- merch_lat: double (nullable = true)
 |-- merch_long: double (nullable = true)
 |-- distance: double (nullable = true)
 |-- age: integer (nullable = true)
 |-- is_fraud: integer (nullable = true)

为什么功能没了???

【问题讨论】:

    标签: apache-spark implicit


    【解决方案1】:

    假设你有你的 SparkSession 并且被命名为 spark

    你可以这样显式地传递它

    val balancedNonFraudDF = createBalancedDataframe(nonFraudDF, fraudCount.toInt)(spark)
    

    或在调用环境中创建隐式引用(spark2 或任何名称)。示例:

    implicit val spark2 = spark
    //some calls
    // others
    val balancedNonFraudDF = createBalancedDataframe(nonFraudDF, fraudCount.toInt)
    

    【讨论】:

    • 可用字段:cc_num、trans_num、trans_time、类别、商家、amt、merch_lat、merch_long、距离、年龄、is_fraud。比如说,cc_num 是特征,trans_num 是标签,那么你可以这样做:`toDF("cc_num", "trans_num").select($"cc_num" as "features", $"trans_num" as "label")
    • 追溯这个
    • featureDF.filter($"is_fraud" === 1) - 在这个数据框中,查看是否所有的 features 值都是空值。如果是这样,这就是它被丢弃的原因。(我认为)
    • 谢谢,不,不为空。
    • 等一下! .select("features", "label")你只选择了两列,你是怎么打印fraudDF.printSchema root |-- cc_num: long (nullable = true) |-- trans_num: string (nullable = true) |-- trans_time: string (nullable = true) |-- category: string (nullable = true) |-- merchant: string (nullable = true) |-- amt: integer (nullable = true) |-- merch_lat: double (nullable = true) |-- merch_long: double (nullable = true) |-- distance: double (nullable = true) |-- age: integer (nullable = true) |-- is_fraud: integer (nullable = true)的?
    猜你喜欢
    • 2017-02-02
    • 2016-01-17
    • 2011-10-17
    • 2016-03-31
    • 2015-01-27
    • 2016-02-27
    • 2016-02-22
    • 2011-04-15
    • 2015-06-28
    相关资源
    最近更新 更多