我试图找到一些推文中排名前20位的单词。 filtered
包含每条推文的单词数组。以下内容:
select explode(filtered) AS words from tweettable
按照您的预期列出每个单词,但我想要的是在所有推文上计算每个单词的数量,然后显示其中的前20个单词。以下工作但我需要在SQL中执行此操作:
df.select(explode($"filtered").as("value"))
.groupBy("value")
.count()
.sort(desc("count"))
.show(20, false)
我在GROUP BY
,words
和filtered
上尝试了explode(filtered)
,但都犯了错误。
答案 0 :(得分:3)
您可以在subqueries
声明中使用FROM
:
SELECT value, count(*) AS count
FROM (SELECT explode(filtered) AS value
FROM tweettable) AS temp
GROUP BY value
ORDER BY count DESC
答案 1 :(得分:0)
以下代码将为您提供完全的想法,以实现您的期望。测试Spark(1.6)
setTimeout('numCount()',1000); // or setTimeout("numCount()",1000);
或者你可以使用窗口功能。
val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
import hiveContext.implicits._
val lst = List(Seq("Hello","Hyd","Hello","Mumbai"),Seq("Hello","Mumbai"),Seq("Hello","Delhi","Hello","Banglore"))
case class Tweets(filtered: Seq[String])
val df = sc.parallelize(lst).map(x=>Tweets(x)).toDF
import org.apache.spark.sql.functions.{explode}
import org.apache.spark.sql.functions.count
df.select(explode($"filtered").as("value")).groupBy("value").agg(count("*").alias("cnt")).orderBy('cnt.desc).show(20,false)