我是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 =>类型。但它继续返回错误。
它可能是什么?
提前致谢
答案 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))
}
}