1. 目录

    创建DataFrame

    List,toDF:使用List[Tuple]包装每行记录,结合toDF接口,,转化为DataFrame

    DataFrameRDD,StructType:推荐使用RDD和schema,生成DataFrame

    RDD,StructType:补充,单个元素构成一行记录,使用Row.apply()

    RDD,StructType:补充,多个元素构成一行记录,使用Row.fromSeq()

    List.map(beanClass(_)):使用case class包装每行记录,借助case class参数列表定义字段信息,每个属性名都会成为DataFrame的列名

    RDD.map(beanClass(_)):使用RDD,生成createDataFrame

    将RDD转化为DataFrame

    按行操作

    DataFrame操作大全

    展示数据

    收集数据

    显示指定字段的描述统计信息

    获取头部数据

    常用sql操作


    1. 创建DataFrame

    1. List,toDF:使用List[Tuple]包装每行记录,结合toDF接口,,转化为DataFrame

      val df = spark.createDataFrame(List(
      ("ming", 20, 15552211521L),
      ("hong", 19, 13287994007L),
      ("zhi", 21, 15552211523L)
      )).toDF("name", "age", "phone")
    2. DataFrameRDD,StructType:推荐使用RDD和schema,生成DataFrame

      import org.apache.spark.sql.Row
      import org.apache.spark.sql.types._
      val testRdd = sc.parallelize(List(List(1,1),List(2,2))).map(line => Row(line(0), line(1)))
      val schema = StructType(List(StructField("id", IntegerType, nullable = true), StructField("code", IntegerType, nullable = true)))
      val df = spark.createDataFrame(testRdd, schema)
    3. RDD,StructType:补充,单个元素构成一行记录,使用Row.apply()

      import org.apache.spark.sql.Row
      import org.apache.spark.sql.types._
      val testRdd = sc.parallelize(List(Row.apply(1), Row.apply(2), Row.apply(3)))
      val schema = StructType(List(StructField("id", IntegerType, nullable = true)))
      val df = spark.createDataFrame(testRdd, schema)
    4. RDD,StructType:补充,多个元素构成一行记录,使用Row.fromSeq()

      import org.apache.spark.sql.Row
      import org.apache.spark.sql.types._
      val testRdd = sc.parallelize(List(Row.fromSeq(List(1,"lijp",99.0)), Row.fromSeq(List(2,"zhangs",85.5)), Row.fromSeq(3,"lis",60.0))))
      val schema = StructType(List(StructField("id", IntegerType, nullable = true), StructField("name", StringType, nullable = true), StructField("score", DoubleType, nullable = true)))
      val df = spark.createDataFrame(testRdd, schema)
    5. List.map(beanClass(_)):使用case class包装每行记录,借助case class参数列表定义字段信息,每个属性名都会成为DataFrame的列名

      case class Test(Field1:Int, Field2:Int)
      val df = spark.createDataFrame(List(List(1,1),List(2,2),List(3,3)).map(line => Test(line(0),line(1))))
      
    6. RDD.map(beanClass(_)):使用RDD,生成createDataFrame

    7. case class Test(Field1:Int, Field2:Int)
      val testRdd = sc.parallelize(List(List(1,1), List(2,2)))
      val df = spark.createDataFrame(testRdd.map(line => Test(line(0), line(1))))
    8. 将RDD转化为DataFrame

      import spark.sqlContext.implicits._
      import spark.implicits._
      case class Line(uid: String, tag:String, time:String, freq:String)
      val df =  sc.textFile(path).map(line => line.split("\\|")).map(line => Line(line(0), line(1), line(2), line(3))).toDF()
      
  2. 按行操作

    // 根据索引操作
    df.map(tag=> "tagcode: " + tag(2)).show()
    // 根据键操作
    df.map(tag=> "tagcode: " + tag.getAs[String]("tagcode")).show()
  3. DataFrame操作大全

    1. 展示数据

      // 显示十行数据
      df.show(10, false)
    2. 收集数据

      // 收集所有结果数据,返回一个Array
      df.collect()
      // 收集所有结果数据,返回一个List
      df.collectAsList()
    3. 显示指定字段的描述统计信息

      df.describe("user").show()
    4. 获取头部数据

      df.first()
      df.head()
      df.take()
      df.takeAsList()
    5. 常用sql操作

      // where:传入sql字符串
      df.where("user=1 or type ='助手1'").show()//filter:传入sql字符串
      df.filter("user=1 or type ='助手1'").show()// like:模糊匹配,需要和where一起用
      df.where(data("uid").like("%lijp%")).show()// like取反
      df.where(!data("uid").like("%lijp%")).show()// 当使用$"uid"时,不支持like操作,但是可以使用col对新增列进行模糊匹配
      functions.col("uid").like("%lijp%")// isin:df中进行in操作需要结合where或者withColumn,isin方法接受变长参数列表
      this.where(col("uid").isin("user1","user2","user3"))// isin:如果isin需要传入List,则需要对List进行列表解析
      this.where(col("uid").isin(List("user1","user2","user3"):_*))// 复合操作:1-collect,将对应dataframe作为List[Row]取回,2-map,从每一行Row中使用getAs[转化类型]("列名"),3-:_*,列表解析元素逐个处理
      this.where(col("uid").isin(that.select("uid").distinct().collect().map(_.getAs[String]("uid")):_*))// select:获取指定字段,可以对字段进行简单逻辑处理
      df.select("user","type").show() 或者 df.select(df("user"),df("user")).show()// selectExpr:传入UDF、函数、as别名
      df.selectExpr("user","type as visittype","to_date(visittime)").show()// col/apply:获取指定字段,作用同df("user")一样
      df.col("user")// limit:获取指定DataFrame的前n行记录,不同于head、take,limit不是action操作// orderBy:按指定字段排序,默认为升序
      df.orderBy("visittime").show(false)// orderBy:降序排列
      df.orderBy(df("visittime").desc).show(false)// group by数据分组
      df.groupBy("user").show() // 传入字段名
      df.groupBy(df("user")).show() // 传入column对象
      df.groupBy("user").count().show() // 配合聚合函数使用:// distinct:去重
      df.distinct()// drop:去除指定字段,保留其他字段
      df.drop("type").show()//agg:聚合操作
      df.groupBy("user").agg(max("id"),sum("user")).show()
      df.agg("id"->"max","user"->"sum").show()//withColumn:添加新的一列
      df.withColumn("sex",df("user")%2).show() // 添加新的列
      df.withColumn("newname",df("oldname")).show() // 覆盖旧的列
      import org.apache.spark.sql.functions.lit // 添加常数列
      val newdf = df.withColumn("newcol",lit("myval"))// join:连接
      df.join(df2,Seq("id")) // 根据指定列聚合(左表、右表都含有指定的字段名,聚合后结果只保留唯一的指定字段名)
      df.join(df2,df("id")===df2("id")) //根据指定列连接(左表、右表都含有指定的字段名,聚合后结果保留各自的指定字段名)// between:范围筛选,包含两端边界
      df.where(col("visittime").between(1,3))
      

【极简spark教程】DataFrame常用操作相关推荐

  1. python spark dataframe_pyspark dataframe 常用操作

    spark dataframe派生于RDD类,但是提供了非常强大的数据操作功能.当然主要对类SQL的支持. 在实际工作中会遇到这样的情况,主要是会进行两个数据集的筛选.合并,重新入库. 首先加载数据集 ...

  2. 【极简spark教程】spark聚合函数

    聚合函数分为两类,一种是spark内置的常用聚合函数,一种是用户自定义聚合函数 UDAF 不带类型的UDAF[较常用] 继承UserDefinedAggregateFunction 定义输入数据的sc ...

  3. 【极简spark教程】RDD编程

    目录 入门 RDD编程指引 创建rdd集合,可以将rdd看做是spark分布式环境下的list 读取文件 RDD操作 转换transform:生成了新的RDD 行动action:汇总所有结果返回驱动程 ...

  4. Spark SQL概述,DataFrames,创建DataFrames的案例,DataFrame常用操作(DSL风格语法),sql风格语法

    一. Spark SQL 1. Spark SQL概述 1.1. 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作 ...

  5. tensorflow平台极简方式_TensorFlow极简入门教程

    原标题:TensorFlow极简入门教程 随着 TensorFlow 在研究及产品中的应用日益广泛,很多开发者及研究者都希望能深入学习这一深度学习框架.本文介绍了TensorFlow 基础,包括静态计 ...

  6. 你好Python -- 极简Python教程

    你好Python -- 极简Python教程 本教程针对Python业余爱好者,展示入门级的编程知识. 目录 你好Python -- 极简Python教程 一. 你好Python! 二. 我想对Pyt ...

  7. Nginx 极简入门教程

    Nginx 极简入门教程 基本介绍 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP服务. Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第 ...

  8. Python极简入门教程

    前言 为了方便各位小白能轻松入门Python,同时加深自己对Python的理解,所以创造了"Python极简入门教程",希望能帮到大家,若有错误请多指正,谢谢.极简入门教程代表着不 ...

  9. pyecharts极简入门教程

    作者:luanhz 来源:小数志 导读 数据可视化是整个数据分析流程中的关键环节,甚至有着一图定成败的关键性地位.前期,陆续推出了matplotlib和seaborn详细入门教程,对于常规的数据探索和 ...

最新文章

  1. 【机器学习入门】(8) 线性回归算法:正则化、岭回归、实例应用(房价预测)附python完整代码和数据集
  2. 正则表达式——全部符号解释(详解)
  3. 启明云端分享|ESP32-­C3­-MINI­-1和ESP32­-C3-­MINI-­1U的区别是什么?
  4. PHP $_SERVER 变量
  5. Qt QMYSQL driver not loaded 解决办法
  6. 用最简单的操作,做最精准的AI模型!
  7. python面试 hashmap是什么_面试不慌,看完保证让你写HashMap跟玩一样
  8. Vscode多个窗口显示多个选项卡/Tabs
  9. php聊天室把数据存在缓存里,php聊天室信息存储的问题
  10. 软件测试初学者如何编写Jmeter测试脚本?
  11. EXCEL常规格式数字转换为日期时间格式的方法
  12. bzoj4816 Sdoi2017 数字表格
  13. 深度学习概念名词解释总结
  14. 每一个圣人都有一个过去
  15. 2018.10.19学习总结
  16. MySQL高级2-优化分析
  17. 用计算机做课文成音乐,用计算机音乐制作手机铃声的理论与实践.pdf
  18. Git统计一段时间内代码的修改量
  19. WPF帝友借贷系统MV模式开发日志2021/04/02_前台登入注册页面搭建
  20. 电脑Windows使用中遇到的那些问题

热门文章

  1. 基因组选择软件市场调研
  2. 中国互联网九大骨干网
  3. 【Endnote20】批量导入enw格式,便捷快速
  4. css---7自定义字体
  5. 2016.11.21回顾 卡方检验
  6. Flash 引导层的使用 模拟小车在弯曲的道路上行驶
  7. windows 远程管理deppin深度操作系统
  8. C#语言和SQL Server数据库技术_程序数据集散地:数据库
  9. c语言解析域名,c语言实现域名解析
  10. 如何拥有一个AI模特?AI绘画换脸换装教程