数据读取与保存

1 动机

Spark支持很多种输入输出源,以下三类常见的数据源如下:

  • 文件格式与文件系统:对于存储在本地文件系统或分布式文件系统(比如NFS, HDFS, Amazon S3等)中的数据,spark可以访问很多种不同的文件格式,包括文本文件、JSON、SequenceFile、以及protocol buffer。
  • Spark SQL中的结构化数据源:spark提供了一套简洁高效的API,处理JSON和Apache Hive在内的结构化数据源。
  • 数据库与键值存储:spark自带的库和一些第三方库,可以用来连接Hbase,ES以及JDBS源等

2 文件格式

Spark 对很多种文件格式的读取和保存方式都很简单。从诸如文本文件的非结构化的文件, 到诸如 JSON 格式的半结构化的文件,再到诸如 SequenceFile 这样的结构化的文件,Spark 都可以支持。Spark 会根据文件扩展名选择对应的处理方式。这一过程是封装 好的,对用户透明。如下是常见的格式:

在这里插入图片描述

2.1 文本文件

当我们将一个文本文件读取为 RDD 时,输入的每一行都会成为 RDD 的一个元素。也可以将多个完整的文本文件一次性读取为一个 pair RDD, 其中键是文件名,值是文件内容。只需要使用文件路径作为参数调用 SparkContext 中的 textFile() 函数,就可以读取一个文 本文件,如下所示:

input = sc.textFile("file://home/spark/README.md")

如果多个输入文件以一个包含数据所有部分的目录的形式出现,可以用两种方式来处 理。可以仍使用 textFile 函数,传递目录作为参数,这样它会把各部分都读取到 RDD 中。有时候有必要知道数据的各部分分别来自哪个文件(比如将键放在文件名中的时间 数据),有时候则希望同时处理整个文件。如果文件足够小,那么可以使用 SparkContext. wholeTextFiles() 方法,该方法会返回一个 pair RDD,其中键是输入文件的文件名。
输出文本文件也相当简单,saveAsTextFile() 方法接收一个路径,并将 RDD 中的内容都输入到路径对应的文件中,Spark 将传入的路径作为目录对待,会在那个 目录下输出多个文件。这样,Spark 就可以从多个节点上并行输出了。在这个方法中,我 们不能控制数据的哪一部分输出到哪个文件中,不过有些输出格式支持控制。如下是保存文本文件:

result.saveAsTextFile(outputFile)

2.2 JSON

JSON 是一种使用较广的半结构化数据格式,读取 JSON 数据的最简单的方式是将数据 作为文本文件读取。如下,python读取JSON数据情况如下:

import json
data = input.map(lambda x: json.loads(x))

2.3 CSV

逗号分隔值(CSV)文件每行都有固定数目的字段,字段间用逗号隔开。与 JSON 一样,CSV 也有很多不同的库,但是只在每种语言中使用一个库。同样,对于 Python 我们会使用自带的 csv 库。

2.4 SequenceFile

SequenceFile 是由没有相对关系结构的键值对文件组成的常用 Hadoop 格式。由于 Hadoop 使用了一套自定义的序列化框架,因此 SequenceFile 是由实现 Hadoop 的 Writable 接口的元素组成。如下是python读取sequenceFile文件:

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

3 Spark SQL中的结构化数据

Spark SQL 是在 Spark 1.0 中新加入 Spark 的组件,并快速成为了 Spark 中较受欢迎的操作结构化和半结构化数据的方式。在各种情况下,我们把一条 SQL 查询给 Spark SQL,让它对一个数据源执行查询(选出一些字段或者对字段使用一些函数),然后得到由 Row 对象组成的 RDD,每个 Row 对象表示一条记录。在 Python 中,可以使用 row[column_number] 以及 row.column_name 来访 问元素。

3.1 Apache Hive

Apache Hive 是 Hadoop 上的一种常见的结构化数据源。Hive 可以在 HDFS 内或者在其他存储系统上存储多种格式的表。要把 Spark SQL 连接到已有的 Hive 上,你需要提供 Hive 的配置文件。你需要将 hive-site. xml 文件复制到 Spark 的 ./conf/ 目录下。这样做好之后,再创建出 HiveContext 对象,也就是 Spark SQL 的入口,然后你就可以使用 Hive 查询语言(HQL)来对你的表进行查询, 并以由行组成的 RDD 的形式拿到返回数据,如下是python创建HiveContext并查询数据:

from pyspark.sql import HiveContext
hiveCtx = HiveContext(sc)
rows = hiveCtx.sql("select name, age from users")
firstRow = rows.first()
print (firstRow.name)

3.2 JSON

如果你有记录间结构一致的JSON 数据,Spark SQL也可以自动推断出它们的结构信息, 并将这些数据读取为记录,这样就可以使得提取字段的操作变得很简单。使用 HiveContext.jsonFile方法来从整个文件中获取由 Row 对象组成的 RDD。假设json文件内容如下:
在这里插入图片描述

如下是基于pytho读取json文件:

data = hiveCtx.jsonFile("file.json")
data.registerTempTable("table_tmp")
results = hiveCtx.sql("select user.name, txt from table_tmp")

猜你喜欢

转载自blog.csdn.net/BGoodHabit/article/details/121577270
今日推荐