Spark:在 SparkSql 中使用 map 和 reduce

Posted

技术标签:

【中文标题】Spark:在 SparkSql 中使用 map 和 reduce【英文标题】:Spark : Use map and reduce with SparkSql 【发布时间】:2017-07-18 09:23:17 【问题描述】:

我不应该问这个问题,我真的不想问,但我迷路了。我看到很多以 wordcount 为例的教程。但是我很难理解如何将它与 sparkSql 一起使用 例如,我有以下查询

Dataset<Row> totalItem = spark.sql(" select icode from bigmart.o_sales");

它给了我数据集?现在我可以遍历 totalItem 并打印结果,但我想计算该项目出现的次数。这可以用 map 和 reduce 来完成,但我不知道该怎么做。 另外,如果有人知道 sparkSql 使用 java 我们可以将结果存储在变量中而不是使用show(),我将非常感激

【问题讨论】:

【参考方案1】:

如果你想计算一个项目出现的次数,你可以使用 sparksql 查询本身来完成,如下所示:

spark.sql("select icode,count(icode) from bigmart.o_sales group by icode")

或者你可以使用api如下:

val df=spark.table("bigmart.o_sales").groupBy($"icode").count.show

希望它能回答你的问题

【讨论】:

谢谢,我写的很长。但我还有一些问题 它的旧写法,可能无法优化,但如果你正在做一些使用 sql 或 dsl 无法完成的事情,那么你可以使用 map 和 reduce 。如果你使用 sql,则会生成优化计划避免不必要的计算 那么,这样做JavaPairRDD&lt;String, Integer&gt; counts =totalItem.toJavaRDD().mapToPair(x -&gt; new Tuple2&lt;&gt;(x.toString(), 1)).reduceByKey((x, y) -&gt; x + y);System.out.println(counts.collect().get(8)); 不好吗? 正如我所说,上面的操作还不错,但可能不会很快,因为您可能会继续进行序列化和反序列化以及类型转换,而大多数操作都可以通过 spark sql 进行优化 谢谢,我选择了你的答案。它为我解决了。你知道我可以用java学习Spark sql的链接吗,因为大部分教程只是复制粘贴字数问题。

以上是关于Spark:在 SparkSql 中使用 map 和 reduce的主要内容,如果未能解决你的问题,请参考以下文章

sparksql缓存表能做广播变量吗

在 Spark 中使用 map() 和 filter() 而不是 spark.sql

group by 子句中的 sparkSQL Map 列

可以在没有运行任何 Map/Reduce (/Yarn) 的情况下对 Hive 表执行 Spark SQL 吗?

SparkSQL:如何在从数据库加载数据集时指定分区列

spark 分组后字符串拼接