SparkSQL(Spark-1.4.0)实战系列(二)——DataFrames进阶

本节主要内容如下

  1. DataFrame与RDD的互操作实战
  2. 不同数据源构建DataFrame实战

DataFrame与RDD的互操作实战

1 采用反映机制进行Schema类型推导(RDD到DataFrame的转换)
SparkSQL支持RDD到DataFrame的自动转换,实现方法是通过Case类定义表的Schema,Spark会通过反射机制读取case class的参数名并将其配置成表的列名。

//导入该语句后,RDD将会被隐式转换成DataFrame
import sqlContext.implicits._

//定义一个类为Person的Case Class作为Schema
case 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信息。具体过程如下:

// 创建RDD
val people = sc.textFile("/data/people.txt")

//Schema字符串
val schemaString = "name age"

// 导入Row
import org.apache.spark.sql.Row;

//导入Spark SQL数据类型
import org.apache.spark.sql.types.{StructType,StructField,StringType};

//利用schemaString动态生成Schema
val schema =
  StructType(
    schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))

// 将people RDD转换成Rows
val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))

// 创建DataFrame
val 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)

添加公众微信号,可以了解更多最新技术资讯

时间: 2024-10-21 13:38:56

SparkSQL(Spark-1.4.0)实战系列(二)——DataFrames进阶的相关文章

SparkSQL(Spark-1.4.0)实战系列(一)——DataFrames基础

主要内容 本教程中所有例子跑在Spark-1.4.0集群上 DataFrames简介 DataFrame基本操作实战 DataFrames简介 本文部分内容译自https://databricks.com/blog/2015/02/17/introducing-dataframes-in-spark-for-large-scale-data-science.html DataFrames在Spark-1.3.0中引入,主要解决使用Spark RDD API使用的门槛,使熟悉R语言等的数据分析师能

SparkSQL(Spark-1.4.0)实战系列(三)——SparkSQL应用案例

本节主要内容 数据准备 案例实战 数据准备 将实验数据Date.txt.Stock.txt.StockDetail.txt(hadoop fs -put /data /data)上传到HDFS上,如下图所示 Date.txt格式如下: //Date.txt文件定义了日期的分类,将每天分别赋予所属的月份.星期.季度等属性 //日期,年月,年,月,日,周几,第几周,季度,旬.半月 2014-12-24,201412,2014,12,24,3,52,4,36,24 Stock.txt格式如下: //S

【转】WF4.0实战系列索引

WF4.0实战系列索引       从WF4.0 betal1出来的时候就开始使用WF4.0,由于资料不多,学习过程也非常艰苦.今年四月份的时候打算写WF4.0实战系列,由于今年是本命年故坚持写了24篇文章.这个系列的文章都有一个特点,就是每篇文章都有一个实例,所以对初学者来说是很有帮助的.这个系列的绝大数文章和程序都是原创,少数是翻译和借鉴别人的.写一个文章索引,方便WF4的学习者查看.     WF4.0实战(一):文件审批流程     WF4.0实战(二):超市收银软件     WF4.0

xen虚拟化实战系列(二)之xen虚拟机安装

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1284591 xen虚拟化实战系列文章列表 xen虚拟化实战系列(一)之xen虚拟化环境安装xen虚拟化实战系列(二)之xen虚拟机安装xen虚拟化实战系列(三)之xen虚拟机复制xen虚拟化实战系列(四)之xen虚拟机扩展磁盘空间一法xen虚拟化实战系列(五)之xen虚拟机扩展磁盘空间再一法xen虚拟化实战系列(六)之x

WF4.0实战(二十三):自定义工作流活动的外观的两种方式

经常有童鞋在群里面问同样一个问题:如何自定义WF4.0活动的外观.其实一共有两种方式去实现自定义WF4.0活动的外观:一种方式我 在以前的博文上实现过,见:WF4.0实战(十一):邮件通知:另外一种方式我将在这里讲述它的实现.故这篇文章中,我将分别用这两种 方式去一个最简单的WF4.0自定义活动外观的例子. 第一种方式:使用[Designer]属性.命名空间为:using System.ComponentModel;代码如下: [Designer(typeof(CustomWriteLineDe

[CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口

Reprint it anywhere u want. 文章Points: 1.介绍RESTful架构风格 2.Spring配置CXF 3.三层初设计,实现WebService接口层 4.撰写HTTPClient 客户端,并实现简单调用     介绍RESTful架构风格     REST是REST之父Roy Thomas创造的,当时提出来了REST的6个特点:客户端-服务器的.无状态的.可缓存的.统一接口.分层系统和按需编码.其具有跨语言和跨平台的优势.     REST是一种架构风格.其描述

WF4.0实战(二十二):一个实际生活中状态机的例子

这是实际生活中的一个状态机的例子:"门".这个例子是Mebyon Kernow写的,使用状态机对门的状态进行控制,我觉得是学习WF4.0中 状态机的好例子.所以,简单的翻译了他这篇文章.希望对你学习WF4.0的状态机有所帮助.以下是正文.原文是:A practical State Machine example 现在,状态机的活动已经发布在Codeplex上面了(详见:http://wf.codeplex.com/).我找出一个经常使用的例子.用这个例子用来演 示如何使用状态机来控制一

WF4.0实战(二十一):Windows Server AppFabric中宿主WF4.0应用程序

在之前的一篇博文Windows Server AppFabric介绍上,简单的介绍了一下Windows Server AppFabric.这篇文章中,我将介绍一下,如 何在将WF4.0应用程序宿主到Windows Server AppFabric中,以及如何持久化配置和追踪配置. 首先,我将使用asp.net和WF4.0实现一个简单的Pizza订购系统.然后将这个应用系统宿主到Windows Server AppFabric上,实现持久化 ,跟踪等配置. Pizza订购系统: 分两部分,一个是a

基于.NET平台网络编程入门实战系列 二

今天的主要任务就是把单击版的搞定,这是过渡到网络版的必备过程. 如果没有玩过扫雷的,建议先去体验一下:体验完后,自己尝试写出扫雷的算法:经过思考揣摩推敲才能有收获.不建议一上来就下载源码剖析,跟踪代码! 现在我来说下我的思路,如果有更优雅的算法,欢迎大家分享------竞争引发技术进步,分享推动技术进步! [一]单机版扫雷划为两层 第一层为Button,Button盖在Lable上,Lable被隐藏在Button下面: 第二层为Lable, Lable上的背景图片改成地雷图案表示有雷. 雷区的大