*以下内容由《Spark快速大数据分析》整理所得。

读书笔记的第三部分是讲的是Spark有哪些常见数据源?怎么读取它们的数据并保存。

Spark有三类常见的数据源:

  • 文件格式与文件系统:它们是存储在本地文件系统或分布式文件系统(比如 NFS、HDFS、Amazon S3 等)中的 数据,例如:文本文件、JSON、SequenceFile, 以及 protocol buffer。
  • Spark SQL中的结构化数据源:它针对包括JSON和Apache Hive在内的结构化数据源。
  • 数据库与键值存储:Spark 自带的库和一些第三方库,它们可以用来连接Cassandra、HBase、Elasticsearch以及JDBC源。

一、文件格式与文件系统

1. 文本文件

2. JSON

3. CSV

4. SequenceFile

二、Spark SQL中的结构化数据源

  1. Hive

  2. JSON

三、数据库与键值存储


一、文件格式与文件系统

1. 文本文件
文本文件读取:

# 方法1:文本文件读取
input = sc.textFile("file://home/holden/repos/sparks/README.md")
# 方法2:如果文件足够小,同时读取整个文件,从而返回一个pair RDD,其中键时输入文件的文件名
input = sc.wholeTextFiles("file://home/holden/salesFiles")

文本文件保存:

result.saveAsTextFile(outputFile)

2. JSON
JSON读取:

# JSON读取
import json
data = input.map(lambda x: json.loads(x))

JSON保存:

# JSON保存 - 举例选出喜爱熊猫的人
(data.filter(lambda x: x["lovesPandas"]).map(lambda x: json.dumps(x)).saveAsTextFile(outputFile))
# 保存文本文件
result.SaveAsTextFile(outputFilePath)

3. CSV
CSV读取:

import csv
import StringIO

# CSV读取 - 如果数据字段均没有包括换行符,只能一行行读取
def loadRecord(line):
"""解析一行CSV记录"""
input = StringIO.StringIO(line)
reader = csv.DictReader(input, fieldnames=["name", "favouriteAnimal"])
return reader.next()

input = sc.textFile(inputFile).map(loadRecord)

# CSV读取 - 如果数据字段嵌有换行符,需要完整读入每个文件
def loadRecords(fileNameContents):
"""读取给定文件中的所有记录"""
input = StringIO.StringIO(fileNameContents[1])
reader = csv.DictReader(input, fieldnames=["name", "favoriteAnimal"])
return reader

fullFileData = sc.wholeTextFiles(inputFile).flatMap(loadRecords)

CSV保存:

# CSV保存
def writeRecords(records):
"""写出一些CSV记录"""
output = StringIO.StringIO()
writer = csv.DictWriter(output, fieldnames=["names", "favoriteAnimal"])
for record in records:
writer.writerow(record)
return [output.getvalue()] pandaLovers.mapPartitions(writeRecords).saveAsTextFile(outputFile)

4. SequenceFile

SequenceFile读取:

# sc.sequenceFile(path, keyClass, valueClass)
data = sc.sequenceFile(inFile, "org.apache.hadoop.io.Text", "org.apache.hadoop.io.IntWritable")

SequenceFile保存(用Scala):

val data = sc.parallelize(List(("Pandas", 3), ("Kay", 6), ("Snail", 2)))
data.saveAsSequenceFile(outputFile)

二、Spark SQL中的结构化数据源

用Spark SQL从多种数据源里读取数据:

1. Hive

用Spark SQL连接已有的Hive:
(1.1)需要将hive-site.xml文件复制到 Spark 的 ./conf/ 目录下;
(1.2)再创建出HiveContext对象,也就是 Spark SQL 的入口;
(1.3)使用Hive查询语言(HQL)来对你的表进行查询。

# 例子:用Python创建HiveContext并查询数据
from pyspark.sql import HiveContext hiveCtx = HiveContext(sc)
rows = hiveCtx.sql("SELECT name, age FROM users")
firstRow = rows.first()
print firstRow.name

2. JSON
(2.1)和使用Hive一样创建一个HiveContext。(不过在这种情况下我们不需要安装好Hive,也就是说你也不需要hive-site.xml文件。);
(2.2)使用HiveContext.jsonFile方法来从整个文件中获取由Row对象组成的RDD。
(2.3)除了使用整个Row对象,你也可以将RDD注册为一张表,然后从中选出特定的字段。

# 例子:在Python中使用Spark SQL读取JSON数据
tweets = hiveCtx.jsonFile("tweets.json")
tweets.registerTempTable("tweets")
results = hiveCtx.sql("SELECT user.name, text FROM tweets")

三、数据库与键值存储

关于Cassandra、HBase、Elasticsearch以及JDBC源的数据库连接,详情请参考书本81-86页内容。

3. Spark常见数据源的更多相关文章

  1. Spring:(三) --常见数据源及声明式事务配置

    Spring自带了一组数据访问框架,集成了多种数据访问技术.无论我们是直接通过 JDBC 还是像Hibernate或Mybatis那样的框架实现数据持久化,Spring都可以为我们消除持久化代码中那些 ...

  2. Spark SQL数据源

    [TOC] 背景 Spark SQL是Spark的一个模块,用于结构化数据的处理. ++++++++++++++ +++++++++++++++++++++ | SQL | | Dataset API ...

  3. Spark常见编程问题解决办法及优化

    目录 1.数据倾斜 2.TopN 3.Join优化 预排序的join cross join 考虑Join顺序 4.根据HashMap.DF等数据集进行filter 5.Join去掉重复的列 6.展开N ...

  4. 4. Spark SQL数据源

    4.1 通用加载/保存方法 4.1.1手动指定选项 Spark SQL的DataFrame接口支持多种数据源的操作.一个DataFrame可以进行RDDs方式的操作,也可以被注册为临时表.把DataF ...

  5. ODBC 常见数据源配置整理

    目录 1. 简介 1.1 ODBC和JDBC 1.2 ODBC配置工具 1.3 ODBC 数据源连接配置 2. MySQL 数据源配置 2.1 配置步骤 2.2 链接参数配置 3. SQLServer ...

  6. spark之数据源之自动分区推断

    在hadoop上创建目录/spark-study/users/gender=male/country=US/users.parquet(并且把文件put上去) code: package cn.spa ...

  7. Spark常见错误汇总

    1. Spark Driver cannot bind on port0, SparkContext initialized failed 如果是通过spark-submit等命令行提交的任务,在sp ...

  8. spark常见错误【持续更新】

    错误1.错误: 找不到或无法加载主类 idea.scala代码 idea 导入的scala工程,编写代码后报该错误. 原因:\src\main\scala 包路径下没有将scala这个包设置成Sour ...

  9. spark sql数据源--hive

    使用的是idea编辑器 spark sql从hive中读取数据的步骤:1.引入hive的jar包 2.将hive-site.xml放到resource下 3.spark sql声明对hive的支持 案 ...

随机推荐

  1. shell-变量的数值运算符-计算双括号(())的使用

    1. 变量的数值计算 变量的数值计算常见的如下几个命令: (()).let.expr.bc.$[]  1) (())用法:(此法很常用,且效率高) 执行简单的整数运算,只需将特定的算术表达式用 &qu ...

  2. ansible-playbook流程控制-when条件判断

    1. ansible-playbook添加判断     when相当于shell脚本里的if 判断,when语句就是用来实现这个功能的,它是一个jinja2的语法,但是不需要双大括号,用法很简单  1 ...

  3. 多测师讲解接口测试 _postman(上)_高级讲师肖sir

    Postman 一.Postman介绍 Postman是一个网页调试工具,也可以调试css.html Postman的操作环境 环境:Postman Mac.Windows X32.Windows X ...

  4. 多测师讲解python _re模块_高级讲师肖sir

    import re# 一.常用方法:# match():从头匹配# search():从整个文本搜索# findall():找到所有符合的# split():分割# sub():替换# group() ...

  5. ASP.Net Core3.1 生成二维码填坑

    ASP.Net Core3.1 使用QrCode生成二维码 部署到Linux报错 The type initializer for 'System.DrawingCore.GDIPlus' threw ...

  6. spring boot:用cookie保存i18n信息避免每次请求时传递参数(spring boot 2.3.3)

    一,用cookie保存i18n信息的优点? 当开发一个web项目(非api站)时,如果把i18n的选择信息保存到cookie, 则不需要在每次发送请求时都传递所选择语言的参数, 也不需要增加heade ...

  7. Windows(WSL2) Linux子系统搭建Docker环境

    摘要:本文主要介绍了如何再Windows(WSL2)中启用Linux系统中,并搭建Docker环境. WSL是适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux ...

  8. SE第一次作业

    作业一.对软件工程的初步认识 下面是我对于软件工程的认识,结合自己的理解和课上听讲的内容 软件工程=软件+工程?软件工程是否就是简单的软件+工程呢?那么我们先来看下各自的概念. 那么什么叫软件呢,既然 ...

  9. unittest学习

    unittest的四大特点 TestCase:测试用例.所有的用例都是直接继承与UnitTest.TestCase类. TestFixture:测试固件.setUp和tearDown分别作为前置条件和 ...

  10. java中的三大注解

    三大注解的作用 Java三大注解分别是@Override @Deprecated @Suppresswarnings @Override 注解表名子类中覆盖了超类中的某个方法,如果写错了覆盖形式,编译 ...