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<String, Integer> counts =totalItem.toJavaRDD().mapToPair(x -> new Tuple2<>(x.toString(), 1)).reduceByKey((x, y) -> x + y);System.out.println(counts.collect().get(8));
不好吗?
正如我所说,上面的操作还不错,但可能不会很快,因为您可能会继续进行序列化和反序列化以及类型转换,而大多数操作都可以通过 spark sql 进行优化
谢谢,我选择了你的答案。它为我解决了。你知道我可以用java学习Spark sql的链接吗,因为大部分教程只是复制粘贴字数问题。以上是关于Spark:在 SparkSql 中使用 map 和 reduce的主要内容,如果未能解决你的问题,请参考以下文章
在 Spark 中使用 map() 和 filter() 而不是 spark.sql