Spark入门:读写Parquet(DataFrame)

【版权声明】博客内容由厦门大学数据库实验室拥有版权!

Spark SQL可以支持Parquet、JSON、Hive等数据源,并且可以通过JDBC连接外部数据源。前面的介绍中,我们已经涉及到了JSON、文本格式的加载,这里不再赘述。这里介绍Parquet,下一节会介绍JDBC数据库连接。

Parquet是一种流行的列式存储格式,可以高效地存储具有嵌套字段的记录。Parquet是语言无关的,而且不与任何一种数据处理框架绑定在一起,适配多种语言和组件,能够与Parquet配合的组件有:
* 查询引擎: Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL
* 计算框架: MapReduce, Spark, Cascading, Crunch, Scalding, Kite
* 数据模型: Avro, Thrift, Protocol Buffers, POJOs

Spark已经为我们提供了parquet样例数据,就保存在“/usr/local/spark/examples/src/main/resources/”这个目录下,有个users.parquet文件,这个文件格式比较特殊,如果你用vim编辑器打开,或者用cat命令查看文件内容,肉眼是一堆乱七八糟的东西,是无法理解的。只有被加载到程序中以后,Spark会对这种格式进行解析,然后我们才能理解其中的数据。
下面代码演示了如何从parquet文件中加载数据生成DataFrame。

scala> import org.apache.spark.sql.SQLContextimport org.apache.spark.sql.SQLContext scala> val sqlContext = new SQLContext(sc)sqlContext: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@35f18100 scala> val users = sqlContext.read.load("file:///usr/local/spark/examples/src/main/resources/users.parquet")users: org.apache.spark.sql.DataFrame = [name: string, favorite_color: string, favorite_numbers: array<int>] scala> users.registerTempTable("usersTempTab") scala> val usersRDD =sqlContext.sql("select * from usersTempTab").rddusersRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[13] at rdd at <console>:34 scala> usersRDD.foreach(t=>println("name:"+t(0)+"  favorite color:"+t(1)))name:Alyssa  favorite color:nullname:Ben  favorite color:red
scala

下面介绍如何将DataFrame保存成parquet文件。

进入spark-shell执行下面命令:

scala> import org.apache.spark.sql.SQLContextimport org.apache.spark.sql.SQLContext scala> val sqlContext = new SQLContext(sc)sqlContext: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@4a65c40 scala> val df = sqlContext.read.json("file:///usr/local/spark/examples/src/main/resources/people.json")df: org.apache.spark.sql.DataFrame = [age: bigint, name: string] scala> df.select("name","age").write.format("parquet").save("file:////usr/local/spark/examples/src/main/resources/newpeople.parquet")
scala

上述过程执行结束后,可以打开第二个终端窗口,在Shell命令提示符下查看新生成的newpeople.parquet:

cd  /usr/local/spark/examples/src/main/resources/ls
Shell 命令

上面命令执行后,可以看到”/usr/local/spark/examples/src/main/resources/”这个目录下多了一个newpeople.parquet,不过,注意,这不是一个文件,而是一个目录(不要被newpeople.parquet中的圆点所迷惑,文件夹名称也可以包含圆点),也就是说,df.select(“name”,”age”).write.format(“parquet”).save()括号里面的参数是文件夹,不是文件名。下面我们可以进入newpeople.parquet目录,会发现下面4个文件:

_common_metadata
_metadata
part-r-00000-ad565c11-d91b-4de7-865b-ea17f8e91247.gz.parquet
_SUCCESS

这4个文件都是刚才保存生成的。现在问题来了,如果我们要再次把这个刚生成的数据又加载到DataFrame中,应该加载哪个文件呢?很简单,只要加载newpeople.parquet目录即可,而不是加载这4个文件,语句如下:

val users = sqlContext.read.load("file:///usr/local/spark/examples/src/main/resources/newpeople.parquet")
(0)

相关推荐

  • 理解Spark SQL(二)—— SQLContext和HiveContext

    使用Spark SQL,除了使用之前介绍的方法,实际上还可以使用SQLContext或者HiveContext通过编程的方式实现.前者支持SQL语法解析器(SQL-92语法),后者支持SQL语法解析器 ...

  • Hive,Hive on Spark和SparkSQL区别

    Hive on Mapreduce Hive的原理大家可以参考这篇大数据时代的技术hive:hive介绍,实际的一些操作可以看这篇笔记:新手的Hive指南,至于还有兴趣看Hive优化方法可以看看我总结 ...

  • 理解Spark SQL(三)—— Spark SQL程序举例

    上一篇说到,在Spark 2.x当中,实际上SQLContext和HiveContext是过时的,相反是采用SparkSession对象的sql函数来操作SQL语句的.使用这个函数执行SQL语句前需要 ...

  • 大数据开发技术之Spark SQL的多种使用方法

    Spark SQL支持多种数据源,如JDBC.HDFS.HBase.它的内部组件,如SQL的语法解析器.分析器等支持重定义进行扩展,能更好的满足不同的业务场景.与Spark Core无缝集成,提供了D ...

  • java 读写Parquet格式的数据 Parquet example

    import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOExce ...

  • 大数据开发之Spark入门

    什么是Spark? ·大数据的电花火石. ·Spark类似于MapReduce的低延迟的交互式计算框架. ·Spark是UC Berkeley AMPLab开发的是一种计算框架,分布式资源工作交由集群 ...

  • 大数据开发之Spark 基础入门学习

    集群相关 Cluster Manager指的是在集群上获取资源的外部服务,为每个spark application在集群中调度和分配资源的组件,目前有三种类型: Standalone:Spark 原生 ...

  • 厨师长教:“8种翻锅基础手法”,厨师入门硬核翻锅教程,快收藏

    厨师长教:“8种翻锅基础手法”,厨师入门硬核翻锅教程,快收藏

  • C语言标准头的使用,C语言入门教程,你我的好帮手

    每个标准库函数都会被声明在一个或多个标准头(standard header)中.这些标准头也包括了 C 语言标准提供的所有宏和类型的定义. 每个标准头都包含一组相关的函数声明.宏和类型定义.例如,数学 ...

  • 迁移学习——入门简介

    一.简介 背景:现如今数据爆炸: 对机器学习模型来说要求快速构建,强泛化 对于数据来说,大部分数据没有标签 所以收集标签数据和从头开始构建一个模型都是代价高昂的,需要对模型和带有标签的数据进行重用 传 ...

  • 草书如何入门?这里有一些妙招!

    草书是书法中的绝域,许多人将草书视为畏途,历史上草书大家相对较少,连宋代最杰出的行书书法家米芾都在主要止步于行书,在草书上建树甚微,可见草书之难. ▲(宋)米芾<中秋诗帖> 草书之难,除辨 ...

  • 现代中医临床大家奉伯未教你如何处方用药,中医入门基本功!

    中医大家秦伯未漫谈处方用药 处方用药的一般法则如七方.十剂等,同学们都很熟悉,不准备多谈.现在谈我所看到实际工作中存在的一些问题,抱着"知无不言,言无不尽"的态度,可能有批评的地方 ...

  • 最好的中药和药方入门篇!

    中药 叶天士来到病家,只见产妇已奄奄一息,其家人称,薛生白诊断后认为是产妇气血双亏,无力运胎,气血滞行,交骨不开.其处方以气血双补.行滞活血.催生下胎药为主.叶天士接过药方一看,此方甚佳,但难以治此病 ...