// dataframe is the topic

一、获得基础数据。先通过rdd的方式获得数据

val ny= sc.textFile("data/new_york/")
val header=ny.first
val filterNY =ny.filter(listing=>{
listing.split(",").size==14 && listing!=header
})

//因为后面多是按照表格的形式来处理dataframe,所以这里增加一个size==14的限制非常有必要。要求数据整齐划一。
val nyMap= filterNY.map(listing=>{
val listingInfo=listing.split(",")
(listingInfo(0).toInt,listingInfo(2),listingInfo(9).toFloat,listingInfo(4))

})

//这里的map并没有采用key val的形式,而是四个字段并列的map格式,这种形式更加适合后面转换成dataframe,原来key value的形式,主要在groupbykey,countbykey,reducebykey的rdd操作的时候才有用。
nyMap.take(20).foreach(println)

二、把rdd转化成dataframe

val nyDF=nyMap.toDF("Room_ID","Room_Type","Price","Neighborhood")

//转化的关键步骤

三、dataframe上的关键常用操作

nyDF.show
//default it will be show 20 rows .But you can specificate row number.eg
nyDF.show(40)

//show函数可以指定行数。
nyDF.select("Room_ID","Room_Type","Price").show
//you can also specificate a row to select a special column.
val countsDF= nyDF.filter("Price< 100.0").groupBy("Room_Type").count()

//这里重点讲一下dataframe 的 groupby 出来的是一个RelationalGroupedDataset 类型的dataset

scala> nyDF.filter("Price< 100.0").groupBy("Room_Type")
res12: org.apache.spark.sql.RelationalGroupedDataset = org.apache.spark.sql.RelationalGroupedDataset@63a4356b

//所有的dataframe的聚合函数都要先groupby 然后在这个基础上再count,等聚合函数。

四、常见dataframe上的聚合函数

val averagePrice=nyDF.filter("Room_Type='Entire home/apt'").groupBy("Neighborhood").
agg(avg("Price"),max("Price"),count("Price"))

averagePrice.show
val averageTypePrice=nyDF.groupBy("Neighborhood","Room_Type").
agg(avg("Price"),max("Price"),count("Price"))

上面两个例子可以看出通过agg函数,然后里面放各种聚合函数。形成新的聚合dataframe列名就是avg("Price")等等

第二个方面groupby也可以根据两个或者多个字段groupby

五、dataframe也有take函数。

dataframe每一行是是一个row类型。take得到的是一个row的数组

scala> averageTypePrice.take(10)
res16: Array[org.apache.spark.sql.Row] = Array([Battery Park City,Entire home/apt,340.9132029339853,9150.0,1636], [Upper West Side,Shared room,137.98664440734558,9900.0,1198], [Coney Island,Private room,73.0,250.0,97], [Bronx Park,Entire home/apt,153.5,865.0,22], [Bronxdale,Shared room,32.5,50.0,8], [Port Morris,Shared room,61.0,62.0,2], [Morris Heights,Entire home/apt,125.0,125.0,1], [Battery Park City,Private room,135.51234567901236,2800.0,810], [Van Cortlandt Park,Private room,61.55,112.0,40], [Unionport,Private room,63.793103448275865,99.0,29])

scala>

六、dataframe也可以sort函数,注意不是sortby

averageTypePrice.sort("Neighborhood").show

averageTypePrice.sort(desc("avg(Price)")).show

这里可以降序排列,默认是升序排列,另外聚合的列名是avg(Price)  不是avg(“Price”)

从show的列名也可以看出来。

七、自定义函数

val finalDf=averagePrice.withColumn("addCol",roundfun(averagePrice("avg(Price)")))

withColum是增加一列的意思。自定义函数的入参是dataframe的一列

val finalDf2=finalDf.drop("avg(Price)").sort(desc("addCol")).show

增加一列对应的是删除一列,使用drop函数。

八、转化为RDD以及类型的处理

val finalRDD=finalDf.rdd

注意val finalRDD=finalDf2.rdd会报错,上面的finalDf2严格来说不是dataframe。finalDf才是一个dataframe

scala> finalRDD.take(1)
res32: Array[org.apache.spark.sql.Row] = Array([Corona,120.56349206349206,1350.0,126,120.0])

scala> nyMap.take(1)
res33: Array[(Int, String, Float, String)] = Array((105,Private room,167.0,Hell's Kitchen))

发现通过dataframe转化过来的rdd,和普通rdd比较。里面没有每个一列的类型,只有一个单体类型row。所以获取里面元素的方法也有变化

九、dataframe转化过来的rdd的类型处理

scala> val row=finalRDD.take(1)
row: Array[org.apache.spark.sql.Row] = Array([Corona,120.56349206349206,1350.0,126,120.0])

scala> row(0)(0)
res34: Any = Corona

scala> row(0)(1)
res35: Any = 120.56349206349206

scala> row(0)(2)
res36: Any = 1350.0

这个any类型如果要转化成想要的类型,要先toString 然后再toInt等等

写一个map来处理:

val finalStandardRdd=finalRDD.map(row=>{
(row(0).toString,row(1).toString.toFloat,row(2).toString.toFloat,row(3).toString.toInt,row(4).toString.toFloat)
})

scala> finalStandardRdd
res38: org.apache.spark.rdd.RDD[(String, Float, Float, Int, Float)] = MapPartitionsRDD[85] at map at <console>:44

发现类型已经正常。

大数据入门到精通11-spark dataframe 基础操作的更多相关文章

  1. 大数据入门到精通14--hive 对 字符串的操作

    一.基本操作 concat(string,string,string)concat_ws(string,string,string)select customer_id,concat_ws(" ...

  2. 大数据入门到精通12--spark dataframe 注册成hive 的临时表

    一.获得最初的数据并形成dataframe val ny= sc.textFile("data/new_york/")val header=ny.firstval filterNY ...

  3. 大数据入门到精通18--sqoop 导入关系库到hdfs中和hive表中

    一,选择数据库,这里使用标准mysql sakila数据库 mysql -u root -D sakila -p 二.首先尝试把表中的数据导入到hdfs文件中,这样后续就可以使用spark来dataf ...

  4. 大数据入门到精通2--spark rdd 获得数据的三种方法

    通过hdfs或者spark用户登录操作系统,执行spark-shell spark-shell 也可以带参数,这样就覆盖了默认得参数 spark-shell --master yarn --num-e ...

  5. 大数据入门到精通13--为后续和MySQL数据库准备

    We will be using the sakila database extensively inside the rest of the course and it would be great ...

  6. 大数据入门到精通9-真正得wordcount

    本章节实现一个真正得wordcount 得spark程序. 一.从本地获得一个数据集 val speechRdd= sc.parallelize(scala.io.Source.fromFile(&q ...

  7. 大数据入门到精通8-spark RDD 复合key 和复合value 的map reduce操作

    一.做基础数据准备 这次使用fights得数据. scala> val flights= sc.textFile("/user/hdfs/data/Flights/flights.cs ...

  8. 大数据入门到精通5--spark 的 RDD 的 reduce方法使用

    培训系列5--spark 的 RDD 的 reduce方法使用 1.spark-shell环境下准备数据 val collegesRdd= sc.textFile("/user/hdfs/C ...

  9. 大数据入门到精通4--spark的rdd的map使用方式

    学习了之前的rdd的filter以后,这次来讲spark的map方式 1.获得文件 val collegesRdd= sc.textFile("/user/hdfs/CollegeNavig ...

随机推荐

  1. SpringMVC 的<mvc:resources>使用映射路径展示文件服务器上的图片

    <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springfr ...

  2. hibernate---级联保存、级联删除

    直接上菜: dept.hbm.xml:关键点标蓝色这部分,inverse表示放弃维护外键关系,cascade就不用说了 <hibernate-mapping package="com. ...

  3. eclipse中mybatis自动生成插件使用

    对于使用Mybatis的开发者来说, 使用mybatis generator来生成mapper 以及配置文件, 可以大大简化工作, mybatis generator有多种工作方式, eclipse插 ...

  4. Jenkins入门-环境搭建(1)

    因为Jenkins的环境搭建比较简单,本来不想来介绍,但是发现有些入门小朋友,从各种网站上下载的各种安装包来搭建,最后导致出现了各种千奇百怪的问题,介于这种情况下我决定还是来写一下Jenkins的环境 ...

  5. 根据CPU核心数确定线程池并发线程数

    一.抛出问题 关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下: 第一派:<Java Concurrency in Practice>即&l ...

  6. [ZZ] 基于Matlab的标记分水岭分割算法

    基于Matlab的标记分水岭分割算法 http://blog.sina.com.cn/s/blog_725866260100rz7x.html 1 综述 Separating touching obj ...

  7. DHCP Option43配置

    在配置Option 43之前,需要保证:1. AP与DHCP服务器之间路由可达,即AP可以获取到IP地址.2. AP与AC之间路由可达,保证AP获取到AC地址后,能够与AC交互信息,建立CAPWAP隧 ...

  8. jenkins使用(ubuntu16.0环境)

    本文总结了使用jenkins过程.大部分是网上链接,以后自已查看使用. ssh远程链接服务器 检查是否开启ssh   ps -ef|grep ssh 1.安装ssh 2.开启root用户 3.充许ro ...

  9. sql server紧急状态下登录脚本

    --打开xp_cmdshell功能  EXEC [sys].[sp_configure] @configname = 'xp_cmdshell', -- varchar(35)    @configv ...

  10. python2的reload模块

    在刚开始写python程序的时候,都会遇到一个很头疼的问题——编码错误,在之前的文章中也做了介绍: 由__future__中unicode_literals引起的错误来研究python中的编码问题 . ...