SparkSQL(Spark-1.4.0)实战系列(二)——DataFrames进阶
来源:互联网 发布:如何破解快刀软件 编辑:程序博客网 时间:2024/05/16 06:28
本节主要内容如下
- DataFrame与RDD的互操作实战
- 不同数据源构建DataFrame实战
DataFrame与RDD的互操作实战
1 采用反映机制进行Schema类型推导(RDD到DataFrame的转换)
SparkSQL支持RDD到DataFrame的自动转换,实现方法是通过Case类定义表的Schema,Spark会通过反射机制读取case class的参数名并将其配置成表的列名。
//导入该语句后,RDD将会被隐式转换成DataFrameimport sqlContext.implicits._//定义一个类为Person的Case Class作为Schemacase class Person(name: String, age: Int)//读取文件并将数据Map成Person实例,然后转换为DataFrame,采用toDF()方法,本实例从HDFS上进行数据读取val people = sc.textFile("/data/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()//将实例为peopler的DataFrame注册成表people.registerTempTable("people")//采用SQLContext中的sql方法执行SQL语句val teenagers = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19")//输出返回结果teenagers.map(t => "Name: " + t(0)).collect().foreach(println)
2 利用程序动态指定Schema
在某些应用场景下,我们可能并不能提前确定对应列的个数,因而case class无法进行定义,此时可以通过传入一个字符串来设置Schema信息。具体过程如下:
// 创建RDDval people = sc.textFile("/data/people.txt")//Schema字符串val schemaString = "name age"// 导入Rowimport org.apache.spark.sql.Row;//导入Spark SQL数据类型import org.apache.spark.sql.types.{StructType,StructField,StringType};//利用schemaString动态生成Schemaval schema = StructType( schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))// 将people RDD转换成Rowsval rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))// 创建DataFrameval peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema)//注册成表peopleDataFrame.registerTempTable("people")//执行SQL语句.val results = sqlContext.sql("SELECT name FROM people")//打印输出results.map(t => "Name: " + t(0)).collect().foreach(println)
通过不同数据源创建DataFrame
前面我们创建DataFrame时,读取的是HDFS中的txt类型数据,在SparkSQL中,它支持多种数据源,主要包括JSON、Parquet等。
//读取json格式数据val jsonFile= sqlContext.read.json("/data/people.json")//jsonFile注册成表jsonFile.registerTempTable("peopleJson")val teenagers = sqlContext.sql("SELECT name FROM peopleJson WHERE age >= 13 AND age <= 19")teenagers.map(t => "Name: " + t(0)).collect().foreach(println)
//保存为parquet格式数据jsonFile.select("name", "age").write.format("parquet").save("/data/namesAndAges.parquet")
parquet文件目录结构如下图
//读取parquet格式数据
val parquetFile = sqlContext.read.parquet(“/data/namesAndAges.parquet”)
//parquetFile注册成表
parquetFile.registerTempTable(“parquetPerson”)
val teenagers = sqlContext.sql(“SELECT name FROM parquetPerson WHERE age >= 13 AND age <= 19”)
teenagers.map(t => “Name: ” + t(0)).collect().foreach(println)
添加公众微信号,可以了解更多最新技术资讯
1 0
- SparkSQL(Spark-1.4.0)实战系列(二)——DataFrames进阶
- SparkSQL(Spark-1.4.0)实战系列(一)——DataFrames基础
- SparkSQL(Spark-1.4.0)实战系列(三)——SparkSQL应用案例
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
- Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优
- Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优
- Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优
- Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优
- Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优
- KVM Snapshot使用qemu-img, libvirt命令
- 【已解决】Android中xml中TextView引用已定义好的样式时出错:android.view.InflateException: Binary XML file line #14: Error
- java数组
- Problem F: 瑞士轮(快速排序过不了)
- 嵌入式系统学习方向
- SparkSQL(Spark-1.4.0)实战系列(二)——DataFrames进阶
- Project Euler:Problem 74 Digit factorial chains
- c++11 lambda表达式详细解析
- 课程实训(银行系统)
- Longest Common Prefix
- ios 开发关键字IBInspectable
- shell中的${},##和%%的使用
- java中null和""的区别
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结