Scala Spark Map数据帧缺少参数类型
我不太熟悉Spark,在映射数据帧时收到错误 我有一个数据流,我想用一个sql数据框来过滤数据。代码如下所示:Scala Spark Map数据帧缺少参数类型,scala,apache-spark,Scala,Apache Spark,我不太熟悉Spark,在映射数据帧时收到错误 我有一个数据流,我想用一个sql数据框来过滤数据。代码如下所示: val textDStream = ssc.textFileStream(inputPath) val activityStream = textDStream.transform(input => { input.flatMap { line => val record = line.split("\\t") Some(Activi
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))
我看不到类型丢失的位置。我已经尝试显式地设置r=>type。但是它继续返回错误
可能是什么
提前感谢成功了
在执行映射之前,我必须将数据帧转换为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
在执行映射之前,我必须将数据帧转换为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是的,这是有效的。如果它必须工作,您需要将其转换为rdd。它在以前的Spark版本中运行良好,但在2.12及以上版本中,您将需要它。是的,这是有效的。如果它必须工作,您需要将其转换为rdd。它在以前的Spark版本中运行良好,但在2.12及abo中运行良好你需要这个。你好,我也遇到了同样的问题。 当我在代码的下一行添加导入hiveCtx.IMPLITS.\u代码
val hiveCtx=new HiveContext(sc)
时,错误被删除。因为此代码将RDD隐式转换为数据帧。
希望能帮助你
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))
}
}
下面是完整的代码,希望能对您有所帮助
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))
}
}
你好,我也遇到了与你相同的问题。 当我在代码的下一行添加导入hiveCtx.IMPLITS.\u代码
val hiveCtx=new HiveContext(sc)
时,错误被删除。因为此代码将RDD隐式转换为数据帧。
希望能帮助你
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))
}
}
下面是完整的代码,希望能对您有所帮助
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))
}
}
你的
.map()
返回什么?如果是一个元组(Tuple,?),那么你需要更多的参数。什么是活动副产品
?事实上,我返回的是一个元组(key,ActivityByProduct)。其中key=(product,timestamp_hour)=(r.getString(0),r.getLong(1)此键用于状态完整操作我已更改为activityByProduct.map{r=>{val key=(r.getString(0),r.getLong(1))val activity=activityByProduct(r.getString(0),r.getLong(1),r.getLong(2),r.getLong(3),r.getLong(4))ActivityFull(键,活动)}它返回相同的错误ActivityByProduct是一个case类,所以您尝试过:.map[((字符串,Long),ActivityByProduct)]{r=>..
?您的.map()
返回什么?如果它是一个元组(Tuple),那么您需要更多的paren。什么是ActivityByProduct
?事实上,我返回的是一个元组(key,ActivityByProduct)。其中key=(product,timestamp_hour)=(r.getString(0),r.getLong(1)此键用于状态操作我已更改为activityByProduct.map{r=>{val key=(r.getString(0),r.getLong(1))val activity=activityByProduct(r.getString(0),r.getLong(1),r.getLong(2),r.getLong(3),r.getLong(4))ActivityFull(key,activity)}返回相同的错误ActivityByProduct是一个case类,因此您尝试了:.map[((字符串,长),ActivityByProduct)]{r=>…
?奇怪。根据Dataframe API文档,它应该直接支持.map。Spark的哪个版本?不,这是正常的,Dataframe需要一个强大的模式定义才能工作。奇怪。根据Dataframe API文档,它应该直接支持.map。Spark的哪个版本?不,这是正常的,Dataframe需要一个强大的模式定义才能工作。