Spark SQL 初始2 之 DataFrame API(2.0)

来源:互联网 发布:送货打单软件 编辑:程序博客网 时间:2024/06/06 09:34

什么是DataFrame

1.  DataFrame 是Spark SQL的主要数据抽象(RDD是Spark的主要数据抽象)
是相同模式行的分布式集合(这些行以命名的列方式组织),等同于关系数据库的表
支持关系操作(selecting, filtering, aggregating, and plotting structured data)。
2. DataFrame 支持从已存在的原生RDD或外部数据源来创建。
3. DataFrame 是延迟评估的,只有当用户调用输出操作,如count(),Spark SQL 才构建
物理计划来执行,在执行过程中采用了优化策略,比如只扫描某些列数据。

DataFrame的特点

1. DataFrame一旦构建就无法修改
2. DataFrame跟踪血缘信息来有效重计算丢失数据
3. DataFrame分布在worker中,可执行并行操作
4. DataFrame的数据集都是按指定列存储
5. DataFrame提供特定领域的语言(DSL)API来操作数据集

DataFrame的操作

1. DataFrame 中每行是Row对象,Row中的字段可以像属性一样被访问

2. DataFrame 有两类操作,分别是: transforms 和actions (这点与RDD相同)



创建DataFrame

1. 从Python集合(List)或Python数据分析库pandas中创建DataFrame

2.
一下代码是从RDD创建DataFrame的方法

val schamaString ="id,gender,height"

val conf =new SparkConf().setAppName("SQLTEST").setMaster("local")

val sc=new SparkContext(conf)

val peopleDataRDD=sc.textFile("/home/xuetao/Downloads/data.txt")

val sqlCtx=new SQLContext(sc)

val schemaArray=schamaString.split(",")

val schema=StructType(schemaArray.map(fieldName=>StructField(fieldName,StringType,true)))

val

rowRDD:RDD[Row]=peopleDataRDD.map(_.split("")).map(eachRow=>Row(eachRow(0),eachRow(1),eachRow(2)))

valpeopleDF=sqlCtx.createDataFrame(rowRDD,schema)

peopleDF.registerTempTable("people")

val hightMale170=sqlCtx.sql("select id, gender, height frompeople where height>170 and gender='M'")

println("Men whose height are more than 170:"+hightMale170.count())

sc.stop()



3.使用Select方法从DataFrame中选择一列或多列,返回一个
新的DataFrame