一、默认配置
Spark_HOME:进入目录/soft/client/spark-2.1.1-bin-2.6.0/conf文件夹,文件如下:
spark-defaults.conf //设置spark maeter地址、每个executor进程的内存、占用核数等
spark-env.sh //spark相关的各种环境变量
log4j.properties.template //设置driver向console输出的日志的等级及格式
fairscheduler.xml.template //设置调度方式
metrics.properties.template //设置spark内部metrics系统,一般无需改动
slaves //设置spark集群中的slave节点(worker),无需改动
hadoop-default.xml //hadoop配置,主要是hdfs配置
hadoop-site.xml //hadoop集群的访问配置
常见默认配置
# ApplicationMaster
spark.yarn.am.memory=8g
spark.yarn.am.cores=5
#spark.yarn.am.memoryOverhead=AM memory * 0.10, with minimum of 384
#spark.yarn.am.extraJavaOptions
# Driver
spark.driver.cores=2
spark.driver.memory=4g
spark.driver.maxResultSize=1g
#spark.yarn.driver.memoryOverhead=driverMemory * 0.10, with minimum of 384
# Executor
spark.executor.cores=4
spark.executor.memory=8g
spark.executor.instances=1
spark.executor.heartbeatInterval=20s
#spark.yarn.executor.memoryOverhead=executorMemory * 0.10, with minimum of 384
#spark.executor.extraJavaOptions=-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
spark提交脚本:
spark-submit example.py
#脚本需要建立Session
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option","some-value") \
.enableHiveSupport() \
.getOrCreate()
#spark连接的物理上的数据库
spark.catalog.listDatabases()
#返回Spark运行时的资源
spark.conf.get("spark.sql.shuffle.partitions")
spark.conf.get("spark.executor.memory")
spark.conf.get("spark.executor.cores")
#get换为set可进行修改
二、Spark SQL操作
初始操作及数据展示
from pyspark.sql.functions import * #引入包
data = spark.sql("select col1 from cf_tmp.data where dt=sysdate(-1)")#读入数据
data.col1.alias('第一列') #别名
data.cache() #将数据加入缓存
data.printSchema() #显示表结构,相当于desc
data.columns #只显示表列名
data.count() #显示数据行数
data.show(5) #展示5行数据
data.first()
data.head(10)
data.describe().show() #描述统计:个数、均值、标准差、最大值、最小值
data.approxQuantile('col',[0.5],0.01) #取分位数
data.limit(5).collect() #全部数据输出,可用limit限制行数
数据表操作:选择行/列
#数据行筛选
temp1 = data.filter("col1>100")
temp1 = data.where("col1>100")
temp1 = data.where(data["col1"]>100)
temp1 = data.where(data.col1>100)
temp2 = data.select('col1', 'col2') #选取数据列
temp2 = data.drop('col1', 'col2') #删除指定列返回其他数据
temp2 = data.withColumnRenamed('col1','column1') #修改列名
temp2 = data.withColumn('col3',temp2.col1==0) #增加列
#抽样
sample = data.limit(100)
sample = data.sample(False, 0.1, 5) #是否可放回、抽样比例、种子
frac = dict([(True,0.1),(False,0.2)]) #定义分层抽样比例
sample = data.sampleBy("col1", fractions=s_frac, seed=0) #分层抽样
Spark只有在需要输出结果的时候才会进行运算,并自带并行处理。
常用函数操作:
data.distinct() #删除每列完全相同的行
data.dropDuplicates() #单列删除重复值
data.na.drop() #删除有缺失值的行
data.na.fill(0) #填充缺失值为0
data.na.fill({'col1':0.01,'col2':0.0}) #以字典的形式填充多列
data.crosstab('col1','col2').show() #列联分析,统计个数
data.groupBy('col1').count() #聚合计数
#avg() min() max() sum() agg()自定义聚合函数
数据聚合/连接
data.sort("col", ascending=False) #降序排列
tmp = data.subtract(data2) #取差集
tmp = data.union(data2) #数据合并,不去重
tmp = data.intersect(data2) #取交集
data12 = data1.join(data2,"col1",'inner')
data12 = data1.join(data2,data1.col1==data2.col2,'left')
三、数据存储
#csv:转化为pandas再输出
data.toPandas().to_csv('/exportfs/home/mycsv.csv')
#写入数据库
df_writer = pyspark.sql.DataFrameWriter(data)
df_writer.format('orc').mode('overwrite').saveAsTable('cf_tmp.temp')
#读写json数据
df_writer = pyspark.sql.DataFrameWriter(temp.select(temp.col))
df_writer.format('json').mode('overwrite').save('$HOME/temp.json')#写
df2 = spark.read.format('json').load('$HOME/temp.json')#读1
df2 = spark.read.json('$HOME/temp.json')#读2