Scala Spark Map DataFrame缺少参数类型

时间:2017-02-06 20:51:03

标签: scala apache-spark

我是Spark新手并在映射数据帧时收到错误。

我有一个DStream,我想使用sql Dataframe对其进行转换以过滤数据。代码是这样的:

  val textDStream = ssc.textFileStream(inputPath)
  val activityStream = textDStream.transform(input => {
    input.flatMap { line =>
      val record = line.split("\\t")
      Some(Activity(record(0).toLong / MS_IN_HOUR * MS_IN_HOUR, record(1), record(2), record(3), record(4), record(5), record(6)))
      }
  })

activityStream.transform(rdd => {

    val df = rdd.toDF()

    df.registerTempTable("activity")
    val activityByProduct = sqlContext.sql("""SELECT
                                        product,
                                        timestamp_hour,
                                        sum(case when action = 'purchase' then 1 else 0 end) as purchase_count,
                                        sum(case when action = 'add_to_cart' then 1 else 0 end) as add_to_cart_count,
                                        sum(case when action = 'page_view' then 1 else 0 end) as page_view_count
                                        from activity
                                        group by product, timestamp_hour """)

    activityByProduct
      .map { r => ((r.getString(0), r.getLong(1)),
        ActivityByProduct(r.getString(0), r.getLong(1), r.getLong(2), r.getLong(3), r.getLong(4))
        )}

  }).print()

这里的问题是我收到以下错误:

  

错误:(58,18)缺少参数类型             .map {r => ((r.getString(0),r.getLong(1)),

activityByProduct
  .map { r => ((r.getString(0), r.getLong(1)),
    ActivityByProduct(r.getString(0), r.getLong(1), r.getLong(2), r.getLong(3), r.getLong(4))
    )}

我无法看到缺少类型的地方。我已经尝试过明确设置r =>类型。但它继续返回错误。

它可能是什么?

提前致谢

3 个答案:

答案 0 :(得分:1)

有效。

我必须在执行map之前将数据帧转换为rdd:

activityByProduct.rdd
      .map { r =>
        ((r.getString(0), r.getLong(1)),
        ActivityByProduct(r.getString(0), r.getLong(1), r.getLong(2), r.getLong(3), r.getLong(4))
        )}

查看activityByProduct

之后的.rdd

答案 1 :(得分:1)

是的,这很有效。如果它必须工作,您需要将其转换为rdd。它在之前的Spark版本中运行良好,但在2.12及更高版本中你将需要它。

答案 2 :(得分:0)

您好我也遇到了同样的问题。 当我将import hiveCtx.implicits._代码添加到我的代码val hiveCtx = new HiveContext (sc)的下一行时,错误已被删除。因为此代码将RDD隐式转换为DataFrame。 希望可以帮到你。

完整的代码发布在下面,希望能为您提供帮助。

package spark.sparkSQL

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.hive.HiveContext

object sparksql2 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("sparksql").setMaster("local")
    val sc = new SparkContext(conf)
    sc.setLogLevel("ERROR")

    val hiveCtx = new HiveContext(sc)
    import hiveCtx.implicits._        //  ImportType(hiveCtx.implicits)

    val input = hiveCtx.jsonFile("./inputFile")
    // Register the input schema RDD
    input.registerTempTable("tweets")
    hiveCtx.cacheTable("tweets")
    // Select tweets based on the retweetCount
    val topTweets = hiveCtx.sql("SELECT text, retweetCount FROM tweets ORDER BY retweetCount LIMIT 10")
    topTweets.collect().map(println(_))
    val topTweetText = topTweets.map(row => row.getString(0))
  }
}