关注公众号:登峰大数据,阅读Spark实战第二版(完整中文版),系统学习Spark3.0大数据框架!如果您觉得作者翻译的内容有帮助,请分享给更多人。您的分享,是作者翻译的动力!

本章涵盖了

  • 解析器的常见行为
  • 从CSV, JSON, XML和文本文件接入数据
  • 理解单行和多行JSON记录之间的区别
  • 理解对大数据特定文件格式的需求

接入数据是大数据处理管道的第一步。您必须将数据装载到Spark实例中,无论它是在本地模式还是集群模式下。正如您现在所知道的,Spark中的数据是暂时的,这意味着当您关闭Spark时,所有数据都消失了。本章您将学习如何从标准文件(包括CSV、JSON、XML和文本)导入数据。在本章中,在学习了各种解析器之间的常见行为之后,您将使用虚构的数据集来说明特定的情况,以及来自开放数据平台的数据集。开始用这些数据集进行分析是很诱人的。当您看到显示在屏幕上的数据时,您将开始思考,“如果我将这个数据集与另一个数据集连接会发生什么?”如果我开始聚合这个领域…“你将在第11章到第15章和第17章学习如何执行这些操作,但首先你需要将所有的数据接入Spark!本章中的示例基于Spark v3.0。Spark行为会随着时间的推移而发展,尤其是在处理CSV文件时。附录L随附本章,作为数据接入选项的参考。在您学习了如何在本章中接入文件数据之后,可以使用该附录作为选项的参考,这样就可以在一个方便的位置找到所有的格式和选项,从而更快地开发。对于本章中研究的每一种文件格式,你会发现,都是按照这个顺序:

  • 描述要接入的文件
  • 演示应用程序结果的所需输出
  • 详细介绍应用程序,以便准确地了解如何使用和调整解析器

新的文件格式在大数据世界中被使用,因为CSV或JSON不能再被切割。在本章的后面,您将了解这些新的、流行的文件格式(如Avro、ORC、Parquet和Copybook)。

图7.1显示了您在数据接入过程中的位置。

图7.1 在你的文件接入之旅中,本章主要关注文件。实验本章的所有例子都可以在GitHub上找到:https:// github.com/jgperrin/net.jgp.books.spark.ch07。附录L为接入参考。7.1 解析器的常见行为

解析器是将数据从非结构化元素(如文件)传输到内部结构的工具;在Spark的场景中,是dataframe。你将要使用的所有解析器都有类似的行为:

  • 解析器的输入是一个文件,您可以通过其路径定位该文件。在读取文件时,可以在路径中使用正则表达式,因此当指定(例如) a* 时,将接入所有以a开头的文件。
  • 选项不区分大小写,因此multiline和multiLine是相同的。

这些行为是依赖于实现的,所以当你使用第三方接入库时(见第9章),你可能不会有相同的行为。如果你有一个特定的文件格式要接入,你可以建立自定义的数据源(也在第9章解释);但是,在构建组件时要记住这些通用行为。7.2 复杂的CSV接入

逗号分隔值(CSV)可能是最流行的数据交换格式。1 .由于它的历史悠久且使用广泛,这种格式在其核心结构中有许多变体:分隔符并不总是逗号,一些记录可能跨越多个行,有各种方法来避免分隔符,以及许多创造性的考虑。因此,当你的客户告诉你,“我将给你发送一个CSV文件”时,你肯定会点头,然后慢慢地开始抓狂。

幸运的是,Spark提供了接入CSV文件的各种选项。获取CSV很容易,而且模式推断是一个强大的特性。

您已经在第1章和第2章中了解了CSV文件,所以在这里您将看到更高级的示例,这些示例带有更多选项,说明了外部世界的CSV文件的复杂性。您将首先查看将要接入的文件并理解其规范。然后,您将查看结果,最后构建一个迷你应用程序来实现该结果。每种格式都将重复此模式。

实验这是200号实验。您将要学习的示例是net.jgp.books .spark.ch07.lab200_csv_ingestion.ComplexCsvToDataframeApp。图7.2说明了您将要实现的过程。

图7.2 Spark接入了一个具有非默认选项的复杂类csv文件。在接收文件之后,数据将在一个dataframe中,您可以从中显示记录和模式——在本例中,模式是由Spark推断的。

在清单7.1中,您将发现一个CSV文件的摘录,其中有两条记录和一个头行。注意,CSV已经成为一个通用术语:如今,C表示字符而不是逗号。您将发现,在一些文件中,值由分号、制表符、管道符(|)等分隔。对于纯粹主义者来说,缩略语可能很重要,但对于Spark来说,所有这些分离器都属于同一类别。一些提示:

  • 文件不是用逗号分隔的,而是用分号分隔的。
  • 我手动添加了段落结束符号来显示每行的结束。它不在文件中。
  • 如果您查看ID为4的记录,将看到标题中有一个分号。这将破坏解析,因此这个字段被星星包围着。请记住,这个示例只是为了进一步说明Spark的一些特性。
  • 如果您查看ID为6的记录,将看到标题被分成两行:Language?在An之前。
id;authorId;title;releaseDate;link ¶4;1;*Harry Potter and the Chamber of Secrets: The Illustrated Edition (Harr➥ y Potter; Book 2)*;10/04/2016;http://amzn.to/2kYhL5n ¶6;2;*Development Tools in 2006: any Room for a 4GL-style Language? ¶An independent study by Jean Georges Perrin, IIUG Board Member*;12/28/2016;  ➥ http://amzn.to/2vBxOe1 ¶

7.2.1 期望输出值

下面的清单显示了可能的输出。我增加了段落标记来说明新行,因为长记录确实不容易阅读。

Excerpt of the dataframe content:+---+--------+------------------------------------------------------------------------------------------+-----------+-----------------------+¶| id|authorId| title|releaseDate| link|¶+---+--------+------------------------------------------------------------------------------------------+-----------+-----------------------+¶ ...| 4 | 1      | Harry Potter and the Chamber of Secrets: The Illustrated Edition (Harry Potter; Book 2)  | 10/14/16  |http://amzn.to/2kYhL5n |¶...| 6 | 2      |Development Tools in 2006: any Room for a 4GL-style Language? ¶An independent study by...| 12/28/16|http://amzn.to/2vBxOe1|¶...+---+--------+------------------------------------------------------------------------------------------+-----------+-----------------------+¶only showing top 7 rowsDataframe's schema:root  |-- id: integer (nullable = true)  |-- authorId: integer (nullable = true)  |-- title: string (nullable = true)  |-- releaseDate: string (nullable = true)   |-- link: string (nullable = true)

清单7.2在接入复杂的CSV文件后希望得到的输出7.2.2 代码

要实现清单7.2中的结果,必须编写类似于清单7.3的代码。您将首先获得一个会话,然后使用方法链在一个调用中配置和运行解析操作。最后,将显示一些记录并显示dataframe的模式。如果您不熟悉模式,可以在附录E中了解更多有关模式的内容。

package net.jgp.books.spark.ch07.lab200_csv_ingestion;import org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;import org.apache.spark.sql.SparkSession;public class ComplexCsvToDataframeApp {     public static void main(String[] args ) {      ComplexCsvToDataframeApp app = new ComplexCsvToDataframeApp();       app .start();    }   private void start() {      SparkSession spark = SparkSession.builder()            .appName( "Complex CSV to Dataframe" )            .master( "local" )            .getOrCreate();      Dataset df = spark .read().format( "csv" )            .option( "header" , "true" )            //我们的一些记录分裂成多行;您可以使用字符串或布尔值,从而更容易从配置文件加载值。            .option( "multiline" , true )            //值之间的分隔符是分号(;)            .option( "sep" , ";" )            //quote字符是星号(*)            .option( "quote" , "*" )            .option( "dateFormat" , "M/d/y" )            .option( "inferSchema" , true )            .load( "data/books.csv" );      System. out .println( "Excerpt of the dataframe content:" );       df .show(7, 90);      System. out .println( "Dataframe's schema:" );       df .printSchema();    } }

正如您可能猜到的那样,在配置解析器之前,您需要知道您的文件是什么样子的(分隔符、转义符等)。Spark不会推断出这些。这种格式是CSV文件所附带的约定的一部分(尽管大多数时候您从来没有得到关于格式的明确描述,所以您必须猜测)。模式推断特性是一个非常简洁的特性。但是,正如您在这里看到的,它并没有推断releaseDate列是一个日期。告诉Spark它是日期的一种方法是指定一个模式。7.3 接收具有已知模式的CSV正如您刚才读到的,接入CSV很容易,而且模式推断是一个强大的特性。但是,当您知道CSV文件的结构(或模式)时,通过告诉Spark使用什么模式来指定数据类型可能会很有用。推断模式是一项开销很大的操作,而指定模式使您能够更好地控制数据类型(参见附录L获取数据类型列表和关于接入的更多提示)。

(未完待续......)  欢迎关注公众号,及时获得最新翻译内容:

如何查看文件是否为csv格式_Spark实战第二版(涵盖Spark3.0)第七章 从文件接入数据...相关推荐

  1. dataframe两个表合并_Spark实战第二版(涵盖Spark3.0)第三章 宏伟的角色dataframe

    关注公众号: 登峰大数据 ,阅读Spark实战第二版(完整中文版),系统学习Spark3.0大数据框架! 如果您觉得作者翻译的内容有帮助,请分享给更多人.您的分享,是作者翻译的动力! 本章涵盖了 使用 ...

  2. python excel文件转为csv文件_python实现将excel文件转化成CSV格式

    python实现将excel文件转化成CSV格式 如下所示: import pandas as pd data = pd.read_excel('123.xls','Sheet1',index_col ...

  3. 使用log4net将日志文件输出替csv格式

    使用log4net将日志文件输出为csv格式 我们在编写程序时,会在程序运行过程中记录一些日志.log4net作为一款经久耐用的日志组件,值得我们信赖.在中小型公司中,往往没有专业的日志服务器来处理应 ...

  4. 第七章 将文件内容复制到另外文件

    文章目录 第七章 将文件内容复制到另外文件 示例 第七章 将文件内容复制到另外文件 示例 本例显示了一个使用本文前面介绍的几个%Library.File方法的样例类. 在示例类Demo.FileDem ...

  5. web安全入门(第七章-1)文件上传漏洞--解析、验证、伪造

    一.客户端检测 1,客户端校验:一般是在网页上写一段Js脚本,用Js去检测,校验上传文件的后缀名,有白名单也有黑名单. 2,判断方式:通过抓包来判断,如果还未抓住包,就弹出不准上传,那么就是前端验证, ...

  6. oracle导出表格式csv,Oracle数据库文件导出为CSV格式的方法

    jquery.Callbacks的实现 前言 本人是一个热爱前端的菜鸟,一直喜欢学习js原生,对于jq这种js库,比较喜欢理解他的实现,虽然自己能力有限,水平很低,但是勉勉强强也算是能够懂一点吧,对于 ...

  7. Python|读取dta文件并录入csv格式

    #导入pandas包 import pandas as pd #读取dta文件 data = pd.io.stata.read_stata('E:\filename.dta') #写入csv,并且转码 ...

  8. 将matlab文件写成csv格式

    知乎回答:将matlab矩阵写成csv同时插入表头 作者:知乎用户 链接:https://www.zhihu.com/question/39707220/answer/82830716 来源:知乎 著 ...

  9. python:如何将excel文件转化成CSV格式

    import pandas as pd data = pd.read_excel('123.xls','Sheet1',index_col=0) data.to_csv('data.csv',enco ...

最新文章

  1. python学习笔记 day44 数据库三范式
  2. Android必备:Android的体系结构
  3. 【大二在读】说说我对“软件工程”的理解
  4. 为什么需要DTO(数据传输对象)
  5. java getjsonarray_无法在Java中访问getJSONArray
  6. 解决: pip install 由于目标计算机积极拒绝,无法连接
  7. go.js中的图标(icons)的使用
  8. 迭代器以及迭代器的作用
  9. 解决Ubuntu系统中文乱码显示问题
  10. 感谢有你们,架构师修行之路!
  11. googlenet网络结构_CNN网络结构的发展
  12. Scala-Unit6-final/type关键字、样例类样例对象
  13. 反应堆模式最牛的那篇论文--由solidmango执笔翻译
  14. big sur java home_无法在macOS Big Sur上运行Eclipse
  15. Web服务器程序解释请求消息并作出响应
  16. LeetCode 144 ——二叉树的前序遍历
  17. 全局变量在多个进程中不共享
  18. 前端通过json数据导出excel表格文件(支持多级表头、复杂表头)(json转excel)
  19. 用友U8案例实验实际成本后台配置
  20. 2019-11-11

热门文章

  1. P1117 [NOI2016]优秀的拆分
  2. SQL Server 通过备份文件初始化复制
  3. 杭电1232(图—并查集)
  4. weblogic8.1在myeclipse中启动正常,在单独的weblogic中无法正常启动的解决方案.
  5. 如何在网页中每小时更新一次数据?
  6. 了解Python编程——Python学习(一)
  7. [转载] Python函数中把列表(list)当参数
  8. [转载] numpy.arctan, math.atan, math.atan2的区别
  9. [转载] Python的双端队列deque
  10. [转载] 重新抛出异常与 public Throwable fillInStackTrace()