如何在Spark SQL的爆炸字段中进行GROUP BY?

时间:2017-04-16 08:07:22

标签: sql apache-spark apache-spark-sql apache-zeppelin apache-spark-1.6

  • Zeppelin 0.6
  • Spark 1.6
  • SQL

我试图找到一些推文中排名前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 BYwordsfiltered上尝试了explode(filtered),但都犯了错误。

2 个答案:

答案 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)