spark中起到driver和worker之间的桥梁的是?SparkContext sc
组织rdd之间依赖关系划分stage的是 DAGSchedule
管理taskSet的是? TaskSchedule
说出rdd中多台机上(worker)上执行的懒算子(变换) map flatMap join(两个rdd数据加一起) groupByKey reduceByKey filter
说出rdd中一台机上(driver)上执行的算子(行为) take collect reduce ...
-------------------------------------------------
etl:数据加载转换导入。做法:sql/编程(scala)。
vi preS.py
from pyspark import SparkConf,SparkContext
#从pyspark中导入SparkConf(配置文件),SparkContext(sc,driver与work的桥梁)模块,其中SparkContext(sc)依赖于SparkConf
conf = SparkConf().setMaster('local[*]').setAppName('he')
#[*]指定进程
sc = SparkContext(conf=conf)
print(sc)
rdd = sc.textFile("/user/hadoop/datas.csv")
rdd = rdd.mapPartitions(lambda it :[x for x in it if not x == ''])
rdd = rdd.map(lambda x:x.split(','))
rdd = rdd.map(lambda x:((x[0],x[1]),x[2]))
rdd = rdd.reduceByKey(lambda x,y:x+y)
datas=rdd.collect()
for d in datas:
print(d)
spark-submit preS.py: spark-submit工具提交Job时Driver运行在本地Client端上
也可以spark-submit preS.py 跟一些参数,方便灵活调用!
RDD理解:
1.弹性分布式数据集分布在不同集群节点的内存中
2.可以理解成一大数组
3.数组的每一元素是RDD的一分区
4.一个RDD可以分布并被运算在多台计算机节点的内存及硬盘中
5.RDD数据块可以放在磁盘上也可放在内存中(取决于设置)
6.如出现缓存失效或丢失,RDD的分区可以重新计算刷新
7.RDD本身是不能被修改的,但RDD可以通过API (底层采用Scala)被变换生成新的RDD
8.有两类对RDD的操作:变换和操作(变换发生在worker机上,操作在driver机上)
RDD类型(2种):
并行集合:
rdd = sc.parallelize([21,4,67,34]):将python list数据转换为rdd分布式数据在work hadoop集群上
rdd.collect():将rdd分布式的数据进行收集并展示driver本地Client端上
文件系统数据集:
sc.textFile("/user/hadoop/datas.csv")
RDD的计算方式(2种)
1. 变换(Transformations) (如:map, filter)的返回值仍然是一个RDD, Transformations操作是Lazy的,也就是说变换只是一些指令集而并不会去马上执行,需要等到有Actions操作的时候才会真正计算给出结果。Lazy Evaluation。
变换:map :一进一出
flatMap :一进多出
filter :过滤
reduceByKey
groupByKey :按key分组
combineByKey :3个参数(1,2,3) 执行顺序2-1-3
union()交集
intersection()并集
subtract()差集
cartesian()笛卡尔集
2. 操作(Actions) (如:count, collect),Actions操作会返回结果或把RDD数据输出 到各类系统中。Actions触发Spark启动并找到最优的计算途径。返回值是非 并行化的数据集合比如 PYTHON 中的list
操作:
take collect reduce top count first foreach
aggregate(a,b,c) :操作 3个参数:第一个参数初始值给后面两个参数,第二个参数每个分区执行,第三个参数将第二个参数执行的结果再执行
reduce :操作
countByValue :操作,得到字典
foreach :操作,无返回值.driver端看不到,worker端可以看到
RDD的cache(缓存)和persist(持久化操作):当数据海量时使用该技术!!
path='hdfs://quickstart.cloudera:8020/user/cloudera/recom/user_friends.csv'
rows = sc.textFile(path) rows.persist() # or rows. .cach
rows.count()
rows.count()
第二个action rows.count() 将不重新从文件中读取RDD
DataFrame:带数据结构的数据集。可以将SchemaRDD注册成表. 这样就可以用SparkSQL访问RDD的数据了。而结果集本身也是SchemaRDD 即 DataFrame
DataFrame(SchemaRDD)的产生方式(4种)
1.用sc.parallelize产生DataFrame
rdd=sc.parallelize([21,4,67,34])
df=rdd.toDF(schema=[‘列名’,’列名’,’列名’])
df.registerTempTable("表名")
mytabledf = spark.sql("sql语句") # mytabledf结果
2.用createDataFrame产生DataFrame
sqlContext = SQLContext(sc)
df = sqlContext.createDataFrame([Row(a=1, intlist=[1,2,3], mapfield={"a": "b"})])
3.读入json, parquet, AVRO 或 CSV文件时直接读成SchemaRDD即DataFrame。这是因为这些文件本身是带有结构的
i:读JSON文件直接产生结构
sqlContext = SQLContext(sc)
df = sqlContext.read.json("c:/temp/people.json")
ii:读parquet文件直接产生结构
df=sqlContext.read.parquet("c:/temp/people.parquet")
4.将PYTHON或R中的DataFrame转换成SPARK中的SchemaRDD
sqlContext = SQLContext(sc)
path='c:/temp/cs-training.csv'
将pandas 转成 spark df
scorecard=pd.read_csv(path, header=None,names=’列名,列名,列名...’)
spDF= sqlContext.createDataFrame(scorecard)
将 spark df 转成 pandas DF
spDF.toPandas().head()
5.SparkSQL:以SQL方式处理上述DataFrame,从而达到数据转换效果
allpeople = sqlContext.sql("SELECT * FROM people where id=4")
allpeople.show()
Spark编程、RDD 功能介绍、RDD 元素变换、RDD 元素操作、DATAFRAME、SparkSQL
最新推荐文章于 2024-05-08 21:57:25 发布