spark Vs hadoop mapreduce
我们知道 spark和mapreduce都是计算机计算引擎,负责执行具体任务代码的执行,但是两者都不负责数据的存储,数据的存储一般是有hadoop hdfs负责的,那么这两个计算引擎谁的计算性能更好呢?
我们现在知道是spark计算引擎比mapreduce要快得多,那么spark拥有这种快速优势的主要原因是什么呢?答案其实很简单,就和我们日常优化应用程序的思路一样,spark也是通过减少磁盘IO,也就是把中间计算结果存储到节点的内存中来达到快速计算的目的,具体如下图所示:
spark sql 的group by常用的语法
为了记住通用的group by的语法,个人感觉使用如下通用的sql语句即可:
df2 = spark.sql("select * from basketball").groupBy("team", "name").agg(
{"year": "count", "salary": "sum"}).withColumnRenamed("count(year)", "yearTotal").withColumnRenamed(
"sum(salary)", "salaryTotal")
详细代码如下:
from pyspark import SparkConf
from pyspark.sql import SparkSession
import traceback
from pyspark.sql.types import IntegerType
appname = "test" # 任务名称
master = "local" # 单机模式设置
'''
local: 所有计算都运行在一个线程当中,没有任何并行计算,通常我们在本机执行一些测试代码,或者练手,就用这种模式。
local[K]: 指定使用几个线程来运行计算,比如local[4]就是运行4个worker线程。通常我们的cpu有几个core,就指定几个线程,最大化利用cpu的计算能力
local[*]: 这种模式直接帮你按照cpu最多cores来设置线程数了。
'''
# spark_driver_host = "10.0.0.248"
try:
# conf = SparkConf().setAppName(appname).setMaster(master).set("spark.driver.host", spark_driver_host) # 集群
conf = SparkConf().setAppName(appname).setMaster(master) # 本地
spark = SparkSession.builder.config(conf=conf).getOrCreate()
sc = spark.sparkContext
player_source = [("laker","kebo","2019", 1000*10000), ("laker","kebo","2020", 2000*10000),
("Cleveland","james","2019", 1500*10000), ("Cleveland","james","2020", 1800*10000)
, ("Cleveland","james","2021", 2500*10000)]
rdd = sc.parallelize(player_source)
df = spark.createDataFrame(rdd, "team: string, name: string, year: string, salary: int")
df.createOrReplaceTempView("basketball")
df2 = spark.sql("select * from basketball").groupBy("team", "name").agg(
{"year": "count", "salary": "sum"}).withColumnRenamed("count(year)", "yearTotal").withColumnRenamed(
"sum(salary)", "salaryTotal")
df2.show()
spark.stop()
print('计算成功!')
except:
traceback.print_exc() # 返回出错信息
print('连接出错!')
计算结果为:
这样我们就可以得到最适用的group by语法的用法