Spark SQL是处理结构化数据的Spark模块。它提供了DataFrames这样的编程抽象。同一时候也能够作为分布式SQL查询引擎使用。

DataFrames

DataFrame是一个带有列名的分布式数据集合。等同于一张关系型数据库中的表或者R/Python中的data frame,只是在底层做了非常多优化;我们能够使用结构化数据文件、Hive tables,外部数据库或者RDDS来构造DataFrames。

1. 開始入口:

入口须要从SQLContext类或者它的子类開始,当然须要使用SparkContext创建SQLContext;这里我们使用pyspark(已经自带了SQLContext即sc):

  1. from pyspark.sql import SQLContext
  2. sqlContext = SQLContext(sc)

还能够使用HiveContext,它能够提供比SQLContext很多其它的功能。比如能够使用更完整的HiveQL解析器写查询,使用Hive UDFs。从Hive表中读取数据等。

使用HiveContext并不须要安装hive,Spark默认将HiveContext单独打包避免对hive过多的依赖

2.创建DataFrames

使用JSON文件创建:

  1. from pyspark.sql import SQLContext
  2. sqlContext = SQLContext(sc)
  3. df = sqlContext.read.json("examples/src/main/resources/people.json")
  4. # Displays the content of the DataFrame to stdout
  5. df.show()

注意:

这里你可能须要将文件存入HDFS(这里的文件在Spark安装文件夹中,1.4版本号)

  1. hadoop fs -mkdir examples/src/main/resources/
  2. hadoop fs -put /appcom/spark/examples/src/main/resources/* /user/hdpuser/examples/src/main/resources/

3.DataFrame操作

  1. from pyspark.sql import SQLContext
  2. sqlContext = SQLContext(sc)
  3. # Create the DataFrame
  4. df = sqlContext.read.json("examples/src/main/resources/people.json")
  5. # Show the content of the DataFrame
  6. df.show()
  7. ## age name
  8. ## null Michael
  9. ## 30 Andy
  10. ## 19 Justin
  11. # Print the schema in a tree format
  12. df.printSchema()
  13. ## root
  14. ## |-- age: long (nullable = true)
  15. ## |-- name: string (nullable = true)
  16. # Select only the "name" column
  17. df.select("name").show()
  18. ## name
  19. ## Michael
  20. ## Andy
  21. ## Justin
  22. # Select everybody, but increment the age by 1
  23. df.select(df['name'], df['age'] + 1).show()
  24. ## name (age + 1)
  25. ## Michael null
  26. ## Andy 31
  27. ## Justin 20
  28. # Select people older than 21
  29. df.filter(df['age'] > 21).show()
  30. ## age name
  31. ## 30 Andy
  32. # Count people by age
  33. df.groupBy("age").count().show()
  34. ## age count
  35. ## null 1
  36. ## 19 1
  37. ## 30 1

4.使用编程执行SQL查询

SQLContext能够使用编程执行SQL查询并返回DataFrame。

  1. from pyspark.sql import SQLContext
  2. sqlContext = SQLContext(sc)
  3. df = sqlContext.sql("SELECT * FROM table")

5.和RDD交互

将RDD转换成DataFrames有两种方法:

  • 利用反射来判断包括特定类型对象的RDD的schema。这样的方法会简化代码而且在你已经知道schema的时候非常适用。
  • 使用编程接口。构造一个schema并将其应用在已知的RDD上。

一、利用反射判断Schema

Spark SQL能够将含Row对象的RDD转换成DataFrame。并判断数据类型。通过将一个键值对(key/value)列表作为kwargs传给Row类来构造Rows。

key定义了表的列名,类型通过看第一列数据来判断。

(所以这里RDD的第一列数据不能有缺失)未来版本号中将会通过看很多其它数据来判断数据类型。像如今对JSON文件的处理一样。

  1. # sc is an existing SparkContext.
  2. from pyspark.sql import SQLContext, Row
  3. sqlContext = SQLContext(sc)
  4. # Load a text file and convert each line to a Row.
  5. lines = sc.textFile("examples/src/main/resources/people.txt")
  6. parts = lines.map(lambda l: l.split(","))
  7. people = parts.map(lambda p: Row(name=p[0], age=int(p[1])))
  8. # Infer the schema, and register the DataFrame as a table.
  9. schemaPeople = sqlContext.createDataFrame(people)
  10. schemaPeople.registerTempTable("people")
  11. # SQL can be run over DataFrames that have been registered as a table.
  12. teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")
  13. # The results of SQL queries are RDDs and support all the normal RDD operations.
  14. teenNames = teenagers.map(lambda p: "Name: " + p.name)
  15. for teenName in teenNames.collect():
  16. print teenName

二、编程指定Schema

通过编程指定Schema须要3步:

  1. 从原来的RDD创建一个元祖或列表的RDD。
  2. 用StructType 创建一个和步骤一中创建的RDD中元祖或列表的结构相匹配的Schema。

  3. 通过SQLContext提供的createDataFrame方法将schema 应用到RDD上。

  1. # Import SQLContext and data types
  2. from pyspark.sql import SQLContext
  3. from pyspark.sql.types import *
  4. # sc is an existing SparkContext.
  5. sqlContext = SQLContext(sc)
  6. # Load a text file and convert each line to a tuple.
  7. lines = sc.textFile("examples/src/main/resources/people.txt")
  8. parts = lines.map(lambda l: l.split(","))
  9. people = parts.map(lambda p: (p[0], p[1].strip()))
  10. # The schema is encoded in a string.
  11. schemaString = "name age"
  12. fields = [StructField(field_name, StringType(), True) for field_name in schemaString.split()]
  13. schema = StructType(fields)
  14. # Apply the schema to the RDD.
  15. schemaPeople = sqlContext.createDataFrame(people, schema)
  16. # Register the DataFrame as a table.
  17. schemaPeople.registerTempTable("people")
  18. # SQL can be run over DataFrames that have been registered as a table.
  19. results = sqlContext.sql("SELECT name FROM people")
  20. # The results of SQL queries are RDDs and support all the normal RDD operations.
  21. names = results.map(lambda p: "Name: " + p.name)
  22. for name in names.collect():
  23. print name

Spark SQL and DataFrame Guide(1.4.1)——之DataFrames的更多相关文章

  1. Spark SQL 之 DataFrame

    Spark SQL 之 DataFrame 转载请注明出处:http://www.cnblogs.com/BYRans/ 概述(Overview) Spark SQL是Spark的一个组件,用于结构化 ...

  2. Spark SQL 之 Migration Guide

    Spark SQL 之 Migration Guide 支持的Hive功能 转载请注明出处:http://www.cnblogs.com/BYRans/ Migration Guide 与Hive的兼 ...

  3. spark结构化数据处理:Spark SQL、DataFrame和Dataset

    本文讲解Spark的结构化数据处理,主要包括:Spark SQL.DataFrame.Dataset以及Spark SQL服务等相关内容.本文主要讲解Spark 1.6.x的结构化数据处理相关东东,但 ...

  4. Spark SQL、DataFrame和Dataset——转载

    转载自:  Spark SQL.DataFrame和Datase

  5. 转】Spark SQL 之 DataFrame

    原博文出自于: http://www.cnblogs.com/BYRans/p/5003029.html 感谢! Spark SQL 之 DataFrame 转载请注明出处:http://www.cn ...

  6. Spark学习之路(八)—— Spark SQL 之 DataFrame和Dataset

    一.Spark SQL简介 Spark SQL是Spark中的一个子模块,主要用于操作结构化数据.它具有以下特点: 能够将SQL查询与Spark程序无缝混合,允许您使用SQL或DataFrame AP ...

  7. Spark 系列(八)—— Spark SQL 之 DataFrame 和 Dataset

    一.Spark SQL简介 Spark SQL 是 Spark 中的一个子模块,主要用于操作结构化数据.它具有以下特点: 能够将 SQL 查询与 Spark 程序无缝混合,允许您使用 SQL 或 Da ...

  8. Spark官方1 ---------Spark SQL和DataFrame指南(1.5.0)

    概述 Spark SQL是用于结构化数据处理的Spark模块.它提供了一个称为DataFrames的编程抽象,也可以作为分布式SQL查询引擎. Spark SQL也可用于从现有的Hive安装中读取数据 ...

  9. spark sql 创建DataFrame

    SQLContext是创建DataFrame和执行SQL语句的入口 通过RDD结合case class转换为DataFrame 1.准备:hdfs上提交一个文件,schema为id name age, ...

随机推荐

  1. gropf

    http://blog.csdn.net/yetyongjin/article/details/7717464 带-pg编译程序$ gcc -pg -o test test.c先运行程序$ ./tes ...

  2. RxJava Subject

    Subject Subject可以看成是一个桥梁或者代理,在某些ReactiveX实现中(如RxJava),它同时充当了Observer和Observable的角色.因为它是一个Observer,它可 ...

  3. 描述 Machine.Config 和 Web.Config(转载)

    NET Framework 提供的配置管理包括范围广泛的设置,允许管理员管理 Web 应用程序及其环境.这些设置存储在 XML 配置文件中,其中一些控制计算机范围的设置,另一些控制应用程序特定的配置. ...

  4. Python实现MapReduce,wordcount实例,MapReduce实现两表的Join

    Python实现MapReduce 下面使用mapreduce模式实现了一个简单的统计日志中单词出现次数的程序: from functools import reduce from multiproc ...

  5. kvm安装windows系统

    1.创建虚拟机镜像文件并指定大小(10G) [root@centos01 ~]# qemu-img create -f raw /opt/windows20031.raw 10G Formatting ...

  6. Unity3d笔试题大全

    1.       [C#语言基础]请简述拆箱和装箱. 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何接口类型的过程. 1.在堆中开辟内存空间. 2.将值类型的数据复制到堆中. ...

  7. python2 python3编码问题记录

    最近在服务器上跑脚本,linux自带的是python 2.x,中文显示经常有问题,通过下面两篇终于弄懂了. https://www.cnblogs.com/575dsj/p/7112767.html ...

  8. [RSpec] LEVEL 1: INTRODUCTION

    Install RSpec: Describe Lets start writing a specification for the Tweet class. Write a describe blo ...

  9. 30款超酷的HTTP 404页面未找到错误设计

    访问网站过程中,我们最常看到的HTTP错误就是404页面未找到错误,很多网站都针对这个错误设计自己富有个性的页面,在今天这篇文章中我们就分 享30多款设计非常霸道的404错误页面,希望大家能够找到更多 ...

  10. Android小技术知识(多用于面试)

    Android Dev Doc Android 开发 多使用内部类 使用方便且效率高 UI方面的知识 一.在编写layout的xml文件时,一定要仔细!如果在报错的时候,如何解决? 解决:将xml仔细 ...