Spark编程、RDD 功能介绍、RDD 元素变换、RDD 元素操作、DATAFRAME、SparkSQL

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个参数(123) 执行顺序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()


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. Spark SQL RDD基本操作Spark SQL RDD是一种分布式数据集,可以通过Spark SQL API进行操作。基本操作包括创建RDD、转换RDD、持久化RDD、计算RDD等。可以使用Spark SQL RDD API中的函数进行操作,如map、filter、reduce等。 2. RDD-DataFrameRDDDataFrameSpark SQL中的两种数据结构。RDD是弹性分布式数据集,而DataFrame是一种结构化数据集。可以通过将RDD转换为DataFrame来进行数据分析和处理。可以使用Spark SQL中的API将RDD转换为DataFrame,如toDF、createDataFrame等。 3. API MySQL:API MySQL是一种用于访问MySQL数据库的应用程序接口。可以使用API MySQL来连接MySQL数据库并进行数据操作,如查询、插入、更新、删除等。在Spark SQL中,可以使用API MySQL来读取和写入MySQL数据库中的数据。可以使用Spark SQL中的API来连接MySQL数据库,如JDBC、ODBC等。 ### 回答2: Spark SQLRDD是一种基础数据结构,它是Resilient Distributed Dataset的简称,即弹性分布式数据集。RDD具有不可变性、分区性和良好的容错性,可以通过多种方式创建。RDD的基本操作包括转换操作和行动操作。转换操作是指基于源数据生成一个新的RDD,而不改变源数据。常见的转换操作包括map、filter和reduceByKey等。行动操作是指触发数据的计算并返回结果。常见的行动操作包括collect、count和reduce等。RDD的优势在于能够在内存中处理海量数据,提高处理速度和效率。 RDDDataFrameSpark SQL的两种核心数据结构。DataFrame是一个二维表格式的数据集合,可以通过多种方式创建,包括从RDD转换而来、读取外部数据源等。与RDD相比,DataFrame有更丰富的API支持和更高的性能优化,同时也提供了SQL查询等类似于关系型数据库的操作DataFrame的基本操作包括列选择、过滤、聚合等。 在使用Spark SQL时,还需要连接外部数据源进行数据读取和写入。常见的外部数据源包括MySQL等关系型数据库。Spark SQL可以通过多种方式连接MySQL,包括使用JDBC和使用DataFrame API。使用JDBC需要在代码中明确连接MySQL的URL、用户名和密码等信息,使用DataFrame API可以通过定义schema和指定数据源路径等方式进行数据读取和写入。连接MySQL需要注意代码的安全性和性能问题。 综上所述,Spark SQLRDDDataFrame和连接外部数据源的API都是使用Spark进行大数据处理的重要组成部分。熟练掌握这些基本操作和API可以提高数据分析和处理的效率和可靠性。 ### 回答3: Spark SQL RDD基本操作Spark SQL中,RDD操作是非常基础且非常重要的。Spark SQL RDD操作可以通过直接调用RDD的API实现,常见的RDD操作有filter、map、reduce等。 1. filter:用于筛选符合条件的元素,过滤掉其余的元素。例如,过滤并输出RDD中包含“spark”的元素rdd.filter(lambda x: "spark" in x).collect() 2. map:用于将每个元素按照一定的规则进行映射,例如将RDD中的每个元素都变成大写: rdd.map(lambda x: x.upper()).collect() 3. reduce:用于按照规定的操作RDD进行迭代归约,例如对RDD中的元素进行相加求和: rdd.reduce(lambda x, y: x+y) RDD-DataFrame Spark SQL支持RDDDataFrame的相互转换。RDDSpark的最基本数据结构之一,DataFrame是一种用于处理结构化数据的API,基于RDD开发而成。 使用RDD创建DataFrame,需要先将RDD映射为Row类型,再通过StructType定义的schema将Row映射为DataFrame。例如: from pyspark.sql import Row from pyspark.sql.types import StructType, StructField, StringType rdd = sc.parallelize([(1, "John"), (2, "Andy"), (3, "Smith")]) row_rdd = rdd.map(lambda x: Row(id=x[0], name=x[1])) schema = StructType([StructField("id", StringType(), True), StructField("name", StringType(), True)]) df = spark.createDataFrame(row_rdd, schema) 使用DataFrame创建RDD,可以使用rdd属性直接将DataFrame转换为RDD。例如: rdd = df.rdd API MySQL Spark SQL可以通过连接MySQL数据库获取数据并进行处理,有两种方法:JDBC和Spark SQL官方提供的DataFrame API。使用JDBC需要先进行MySQL的配置,然后通过JDBC连接到MySQL数据库并读取数据,例如: from pyspark.sql import SparkSession spark = SparkSession.builder.appName("MySQLRead").getOrCreate() url = "jdbc:mysql://localhost:3306/mydatabase" properties = {"user": "root", "password": "xxx"} query = "(select * from mytable) as mytable" df = spark.read.jdbc(url=url, table=query, properties=properties) 而使用Spark SQL官方提供的DataFrame API,可以使用read.format连同jdbc并指定数据库地址、用户名、密码等参数,例如: from pyspark.sql import SparkSession spark = SparkSession.builder.appName("MySQLRead").getOrCreate() df = spark.read.format("jdbc"). \ option("url", "jdbc:mysql://localhost:3306/mydatabase"). \ option("user", "root"). \ option("password", "xxx"). \ option("dbtable", "(select * from mytable) as mytable"). \ load() 两种方法均可以完成对MySQL数据库的读取和数据处理。 总结 Spark SQLRDD操作RDD-DataFrame转换以及MySQL API均为Spark SQL的基本操作。可以利用这些基本操作实现Spark SQL中的数据处理、计算和分析等功能。同时,Spark SQL还提供了丰富的API和函数库,可以根据具体需求在其基础上进行拓展和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值