跟关系数据库的表(Table)一样,DataFrame是Spark中对带模式(schema)行列数据的抽象。DateFrame广泛应用于使用SQL处理大数据的各种场景。创建DataFrame有很多种方法,比如从本地List创建、从RDD创建或者从源数据创建,下面简要介绍创建DataFrame的三种方法。

方法一,Spark中使用toDF函数创建DataFrame

通过导入(importing)Spark sql implicits, 就可以将本地序列(seq), 数组或者RDD转为DataFrame。只要这些数据的内容能指定数据类型即可。

本地seq + toDF创建DataFrame示例:

import sqlContext.implicits._
val df = Seq((1, "First Value", java.sql.Date.valueOf("2010-01-01")),(2, "Second Value", java.sql.Date.valueOf("2010-02-01"))
).toDF("int_column", "string_column", "date_column")

注意:如果直接用toDF()而不指定列名字,那么默认列名为"_1", "_2", ...

通过case class + toDF创建DataFrame的示例

// sc is an existing SparkContext.
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// this is used to implicitly convert an RDD to a DataFrame.
import sqlContext.implicits._// Define the schema using a case class.
// Note: Case classes in Scala 2.10 can support only up to 22 fields. To work around this limit,
// you can use custom classes that implement the Product interface.
case class Person(name: String, age: Int)// Create an RDD of Person objects and register it as a table.
val people = sc.textFile("examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()
people.registerTempTable("people")// 使用 sqlContext 执行 sql 语句.
val teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")// 注:sql()函数的执行结果也是DataFrame,支持各种常用的RDD操作.
// The columns of a row in the result can be accessed by ordinal.
teenagers.map(t => "Name: " + t(0)).collect().foreach(println)

方法二,Spark中使用createDataFrame函数创建DataFrame

SqlContext中使用createDataFrame也可以创建DataFrame。跟toDF一样,这里创建DataFrame的数据形态也可以是本地数组或者RDD。

通过row+schema创建示例

import org.apache.spark.sql.types._
val schema = StructType(List(StructField("integer_column", IntegerType, nullable = false),StructField("string_column", StringType, nullable = true),StructField("date_column", DateType, nullable = true)
))val rdd = sc.parallelize(Seq(Row(1, "First Value", java.sql.Date.valueOf("2010-01-01")),Row(2, "Second Value", java.sql.Date.valueOf("2010-02-01"))
))
val df = sqlContext.createDataFrame(rdd, schema)

方法三,通过文件直接创建DataFrame

使用parquet文件创建

val df = sqlContext.read.parquet("hdfs:/path/to/file")

使用json文件创建

val df = spark.read.json("examples/src/main/resources/people.json")// Displays the content of the DataFrame to stdout
df.show()
// +----+-------+
// | age|   name|
// +----+-------+
// |null|Michael|
// |  30|   Andy|
// |  19| Justin|
// +----+-------+

使用csv文件,spark2.0+之后的版本可用

//首先初始化一个SparkSession对象
val spark = org.apache.spark.sql.SparkSession.builder.master("local").appName("Spark CSV Reader").getOrCreate;//然后使用SparkSessions对象加载CSV成为DataFrame
val df = spark.read.format("com.databricks.spark.csv").option("header", "true") //reading the headers.option("mode", "DROPMALFORMED").load("csv/file/path"); //.csv("csv/file/path") //spark 2.0 apidf.show()

补充:spark数据集的演变:

Spark创建DataFrame的三种方法相关推荐

  1. Java创建线程的三种方法

    这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...

  2. Java 创建线程的三种方法比较

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...

  3. Python创建多线程的三种方法

    Python创建多线程的三种方法 thread模块函数式创建线程 继承threading类创建多线程 threading模块函数式创建线程 使用总结 thread模块函数式创建线程 调用thread模 ...

  4. oracle创建数据库的三种方法

    新建Oracle数据库三种方法: 1.通过运行Oracle Database Configuration Assistant创建配置或删除数据库(也可在命令行下输入dbca): 2.用命令行的方式建立 ...

  5. docker创建镜像的三种方法

    在工作中我们交付给你客户的往往都是一些定定制的容器,但是在这之前我们要先学会怎么去创建镜像来交付 一.docer创建镜像的创建方法 创建docker镜像的三种方法,分别是基于已有的容器创建.基于本地模 ...

  6. 创建线程的三种方法_Netty源码分析系列之NioEventLoop的创建与启动

    前言 前三篇文章分别分析了 Netty 服务端 channel 的初始化.注册以及绑定过程的源码,理论上这篇文章应该开始分析新连接接入过程的源码了,但是在看源码的过程中,发现有一个非常重要的组件:Ni ...

  7. JAVA中创建线程的三种方法及比较

    JAVA中创建线程的方式有三种,各有优缺点,具体如下: 目录 一.继承Thread类来创建线程 二.实现Runnable接口来创建线程 三.通过Callable和Future来创建线程 四.三种方式创 ...

  8. 细说 MySQL 创建表的三种方法

    文章目录 CREATE TABLE CREATE TABLE ... LIKE CREATE TABLE ... SELECT 总结 大家好!我是只谈技术不剪发的 Tony 老师. SQL 标准使用 ...

  9. linux新增mysql用户_MySQL创建用户的三种方法

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...

最新文章

  1. 选对论文,效率提升50% | 本周值得读
  2. windows下实现c++版faster-rcnn
  3. Java开发中JDBC连接数据库代码和步骤
  4. 《WTM送书活动:向更遥远的星辰大海起航~》
  5. 【牛客 - 318L】彪神666(水题,半高精度,递推,trick)
  6. 计算机网络常见面试真题详解
  7. react-native Android release打包失败
  8. Problem Solving(POJ-3265)
  9. python k线合成_在VNPY中策略中,使用分钟线合成日K线
  10. mysql 一条记录的某个字段为空,是否占用存储
  11. 条形码jsbarcode
  12. 基础篇:6.7)形位公差-基本规则 Basic Rules
  13. Linux中tar的参数zxf,tar命令
  14. npm install 提示 path .../node_modules/node-sass command failed
  15. Kafka的消息模型
  16. 打印机连接不上打印设备提示0x0000011b 正式解决方案无需卸载补丁
  17. shell脚本语法基础汇总
  18. 19.Java复习(二)
  19. 【解决方案】AI视频结构化智能安防平台EasyCVR在森林火灾监测项目中的应用
  20. 在二十四节气中,冬至是个大节气,从冬至以后就开始数九啦一九二九不出手,

热门文章

  1. Android中的多种文件读写操作方法
  2. ubuntu docker慢_基于docker搭建MulVAL攻击图
  3. mysql提权_mysql提权总结
  4. openpyxl 插入列_[Python]Excel编程(openpyxl)学习笔记
  5. 古风登陆html,再祭古风扬 文/凌霄一羽
  6. php读取文件和读取redis,本地测试读取redis和普通文件缓存的速度,redis慢一倍?...
  7. 阿里docker安装mysql_docker安装mysql
  8. sounds speech_speech sounds
  9. python图书管理系统增删改查_python基础-字典的增删改查
  10. 编写函数求字母出现次数c语言,c语言,程序设计题,输入一个字符串,统计该字符串中the出现次数。...