// 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. 苹果pns推送和唤醒

    使用的是苹果自己的推送服务器 certificatePath 推送证书 VoipcertificatePath 唤醒证书 certificatePassword 证书密码 以上三项都是需要使用上架了A ...

  2. day03字符串

    字符串 1.方法详细内容 方法 强制转换 ##### 1.大小写转换 Value.upper() / value.lower() new_value=value.upper() print(new_v ...

  3. while RE Validation

    一.简介 为什么需要正则表达式? 文本的复杂处理 正则表达式的优势和用途? 一种强大而灵活的文本处理工具: 大部分编程语言.数据库.文本编辑器.开发环境都支持正则表达式. 正则表达式定义: 正如它的名 ...

  4. 文件内容比较difflib

    #!/usr/bin/env python#-*- coding:utf-8 -*-import difflibimport sys,osos.chdir('E:\\PythonWrok')a = o ...

  5. zombodb 配置设置

    主要是关于es 集群地址以及分片,复制副本的配置,配置主要在postgresql.conf,当然我们可以在函数中指定 postgresql.conf 级别的配置 es 配置 格式 zdb.defaul ...

  6. spring IOC 和AOP 方面

    spring 的2大核心 是Ioc 和 aop  spring的依赖注入:在程序运行期间,由外部容器动态的将依赖对象注入到组件中  IOC: 实例化spring容器的二种方法 第一种:在类路径下寻找配 ...

  7. oracle impdp导入脚本

    第一步:sqlplus: sys下面 create directory data_dir as '/home/oracle/dmp/user'; 第二步:sqlplus: sys下面grant rea ...

  8. 半分钟学会使用markdown基本语法

    想看文字版的看这个吧https://www.jianshu.com/p/191d1e21f7ed

  9. 解决Ubuntu中文显示为乱码

    1. 安装所需软件 sudo apt-get install zh-autoconvert sudo apt-get install zhcon 2. 配置系统 $ vi /var/lib/local ...

  10. CSS之padding&margin

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...