大数据开发之数据读取—Pandas vs Spark
数据读取是所有数据处理分析的第一步,而 Pandas 和 Spark 作为常用的计算框架,都对常用的数据源读取内置了相应接口。总体而言,大数据培训数据读取可分为从文件读取和从数据库读取两大类,其中数据库读取包含了主流的数据库,从文件读取又区分为不同的文件类型。基于此,本文首先分别介绍 Pandas 和 Spark 常用的数据读取 API,而后进行简要对比分析。
01 Pandas 常用数据读取方法
Pandas 内置了丰富的数据读取 API,且都是形如 pd.read_xxx 格式,通过对 pd 顶级接口方法进行过滤,得到 Pandas 中支持的数据读取 API 列表如下:
过滤 pandas 中以 read 开头的方法名称
按照个人使用频率,对主要 API 接口介绍如下:
read_sql:用于从关系型数据库中读取数据,涵盖了主流的常用数据库支持,一般来讲 pd.read_sql 的第一个参数是 SQL 查询语句,第二个参数是数据库连接驱动,所以从这个角度讲 read_sql 相当于对各种数据库读取方法的二次包装和集成;
read_csv:其使用频率不亚于 read_sql,而且有时考虑数据读取效率问题甚至常常会首先将数据从数据库中转储为 csv 文件,而后再用 read_csv 获取。这一转储的过程目的有二:一是提高读取速度,二是降低数据读取过程中的运行内存占用(实测同样的数据转储为 csv 文件后再读取,内存占用会更低一些);
read_excel:其实也是对 xlrd 库的二次封装,用来读取 Excel 文件会更加方便,但日常使用不多;
read_json:json 文件本质上也属于结构化数据,所以也可将其读取为 DataFrame 类型,但如果嵌套层级差别较大的话,读取起来不是很合适;
read_html:这应该算是 Pandas 提供的一个小彩蛋了,表面上看它就是一个用于读取 html 文件中数据表格的接口,但实际上有人却拿他来干着爬虫的事情……
read_clipboard:这可以算是 Pandas 提供的另一个小彩蛋,用于从剪切板中读取结构化数据到 DataFrame 中。至于数据是如何到剪切板中的,那方式可能就多种多样了,比如从数据库中复制、从 excel 或者 csv 文件中复制,进而可以方便的用于读取小型的结构化数据,而不用大费周章的连接数据库或者找到文件路径!
read_table:可用于读取 txt 文件,使用频率不高;
read_parquet:Parquet 是大数据中的标志性文件,Pandas 也对其予以支持,但依赖还是很复杂的;
另外,还有 ocr 和 pickle 等文件类型,其中 OCR 是 Hive 中的标准数据文件类型,与 Parquet 类似,也是列式存储,虽然 Pandas 也提供支持,但既然是大数据,其实与 Pandas 已经关系不大了;而 pickle 则是 python 中常用的序列化存储格式。
在以上方法中,重点掌握和极为常用的数据读取方法当属 read_sql 和 read_csv 两种,尤其是 read_csv 不仅效率高,而且支持非常丰富的参数设置,例如支持跳过指定行数(skip_rows)后读取一定行数(nrows)的数据,就是这个小技巧使得曾经小内存的我也能得以处理大数据,着实欣喜!
02 Spark 常用数据读取方法
与 Pandas 类似,Spark 也提供了丰富的数据读取 API,对于常用的数据读取方法也都给予了非常好的支持。这里以 Scala Spark 为例,通过 tab 键补全命令查看常用的数据读取方法如下:
通过 spark-shell 的 tab 键补全得到 spark.read.的系列方法
可以明显注意到 Spark 的数据读取 API 与 Pandas 接口名称的一个显著区别是:Spark 采用二级接口的方式,即首先调用 read 属性获取读接口的类,然后再区分数据源细分为各种类型;而 Pandas 则是直接提供了 read_各数据类型的 API。仍然按照使用频率来分:
spark.read.parquet:前面已经提到,parquet 是大数据中的标准文件存储格式,也是 Apache 的顶级项目,相较于 OCR 而言,Parquet 更为流行和通用。Parquet 的优势也不少,包括内置了数据 Schema、高效的压缩存储等;
spark.read.jdbc:通过 jdbc 提供了对读取各主流数据库的支持,由于其实际上也是一个类,所以相应的参数设置都要依托 option 方法来进行传递,最后通过执行 load 实现数据的读取。但不得不说,spark 内置的一些默认参数相较于 Pandas 而言合理性要差很多,例如 fetchSize 默认为 10,这对于大数据读取而言简直是致命的打击,谁用谁知道……
spark.read.csv:spark 对于 csv 文件也给予了很好的支持,但参数配置相较于 Pandas 而言则要逊色很多
spark.read.textFile:典型的 txt 文件读取方式,相信很多人的一个 Spark 项目 word count 大多是从读取 txt 文件开始的吧,不过对于个人而言好像也仅仅是在写 word count 时才用到了 read.textFile。
其他也有 read.json 和 read.orc 等,但使用频率不高。
如果说 Pandas 读取数据库是最为常用的方法,那么 Spark 其实最为常用的当属 Parquet,毕竟 Parquet 文件与 Spark 等同为 Apache 顶级项目,而且更具大数据特色,称得上是大数据文件存储的业界规范!
03 小结
整体来看,Pandas 和 Spark 在数据读取方面都提供了丰富的接口,支持的数据源类型也大体相当。但对参数支持和易用性方面,Pandas 对数据库和 csv 文件相对更加友好,而 Spark 与 Parquet 文件格式则更为搭配。虽然同为数据计算框架,但 Pandas 是单机计算模式,而 Spark 则是分布式计算,所以不同的数据量级也自然决定了数据源的侧重点不同,本无高下之分,只能说各有千秋。
原创作者:luanhz
评论