==> 什么是parquet

        Parquet 是列式存储的一种文件类型

 

==> 官网描述:

Apache Parquet is a columnar storage format available to any project in the Hadoop ecosystem, regardless of the choice of data processing framework, data model or programming language

        无论数据处理框架,数据模型或编程语言的选择如何,Apache Parquet都是Hadoop生态系统中任何项目可用的列式存储格式

 

==> 由来

    Parquet的灵感来自于2010年Google发表的Dremel论文,文中介绍了一种支持嵌套结构的存储格式,并且使用了列式存储的方式提升查询性能,在Dremel论文中还介绍了Google如何使用这种存储格式实现并行查询的,如果对此感兴趣可以参考论文和开源实现Apache Drill。

==> 特点:

    ---> 可以跳过不符合条件的数据,只读取需要的数据,降低 IO 数据量

    ---> 压缩编码可以降低磁盘存储空间(由于同一列的数据类型是一样的,可以使用更高效的压缩编码(如 Run Length Encoding t  Delta Encoding)进一步节约存储空间)

    ---> 只读取需要的列,支持向量运算,能够获取更好的扫描性能

    ---> Parquet 格式是 Spark SQL 的默认数据源,可通过 spark.sql.sources.default 配置

 

==> parquet 常用操作

---> load 和 save 函数

// 读取 Parquet 文件
val usersDF = spark.read.load("/test/users.parquet") // 查询 Schema 和数据
usersDF.printSchema
usersDF.show // 查询用户的 name 和喜爱颜色并保存
usersDF.select($"name", $"favorite_color").write.save("/test/result/parquet")
// 验证结果 可通过 printSchema 查询数据结构,使用 show 查看数据 // 显式指定文件格式: 加载 json 格式
val usersDF = spark.read.format("json").load("/test/people.json") // 存储模式(Save Modes)
// 可以采用 SaveMode 执行存储操作, SaveMode 定义 了对数据的处理模式,需要注意的是,这些保存模式不使用任何锁定,不是原子操作
// 当使用 Overwrite 方式执行时,在输出新数据之前,原数据就已经被删除
usersDF.select($"name").write.save("/test/parquet1") // 若 /test/parquet1 存在会报错
usersDF.select($"name").wirte.mode("overwrite").save("/test/parquet1") // 使用 overwrite 即可 // 将结果保存为表, 也可以进行分区, 分桶等操作: partitionBy bucketBy
usersDF.select($"name").write.saveAsTable("table1")

  

 

    ---> Parquet文件 

            Parquet 是一个列格式而且用于多个数据处理系统中

       Spark SQL 提供支持对于 Parquet 文件的读写,也就是自动保存原始 数据的 Schema, 当写 Parquet 文件时,所有的列被自动转化为 nullable,因为兼容性的缘故

 

        ---- 读取 Json 格式的数据,将其转换成 parquet 格式,创建相应的表,使用 SQL 语句查询

// 从 json 文件中读入数据
val empJson = spark.read.json("/test/emp.json")
// 将数据保存为 parquet
empJson.write.mode("overwrite").parquet("/test/parquet")
// 读取 parquet
val empParquet = spark.read.parquet("/test/parquet")
// 创建临时表 emptable
empParquet.createOrReplaceTempView("emptalbe")
// 使用 SQL 语句执行查询
spark.sql("select * from emptable where deptno=10 and sal>1500").show

  

 

        ---- Schematic 的合并: 先定义一个简单的 Schema,然后逐渐增加列描述,用户可以获取多个有多个不同 Schema 但相互兼容的 Parquet 文件

// 创建第一个文件
val df1 = sc.makeRDD(1 to 5).map(x=> (x, x*2)).toDF("single", "double")
scala> df1.printSchema
root
|-- single: integer (nullable = false)
|-- double: integer (nullable = false) // 创建第二个文件
scala> val df2 = sc.makeRDD(6 to 10).map(x=> (x, x*2)).toDF("single", "triple")
df2: org.apache.spark.sql.DataFrame = [single: int, triple: int] scala> df2.printSchema
root
|-- single: integer (nullable = false)
|-- triple: integer (nullable = false) scala> df2.write.parquet("/data/testtable/key=2") // 合并上面的两个文件
scala> val df3 = spark.read.option("mergeSchema", "true").parquet("/data/testtable")
df3: org.apache.spark.sql.DataFrame = [single: int, double: int ... 2 more fields] scala> df3.printSchema
root
|-- single: integer (nullable = true)
|-- double: integer (nullable = true)
|-- triple: integer (nullable = true)
|-- key: integer (nullable = true) scala> df3.show
+------+------+------+---+
|single|double|triple|key|
+------+------+------+---+
| 8| null| 16| 2|
| 9| null| 18| 2|
| 10| null| 20| 2|
| 3| 6| null| 1|
| 4| 8| null| 1|
| 5| 10| null| 1|
| 6| null| 12| 2|
| 7| null| 14| 2|
| 1| 2| null| 1|
| 2| 4| null| 1|
+------+------+------+---+

  

 

    ---> Json Datasets(两种写法)

// 第一种
scala> val df4 = spark.read.json("/app/spark-2.2.1-bin-hadoop2.7/examples/src/main/resources/people.json")
df4: org.apache.spark.sql.DataFrame = [age: bigint, name: string] scala> df4.show
+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
+----+-------+ // 第二种
scala> val df5 = spark.read.format("json").load("/app/spark-2.2.1-bin-hadoop2.7/examples/src/main/resources/people.json")
df5: org.apache.spark.sql.DataFrame = [age: bigint, name: string] scala> df5.show
+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
+----+-------+

  

 

    ---> JDBC 方式读取关系型数据库中的数据(需要将 JDBC 的驱动加入)

// 将 JDBC 的驱动加入
bin/spark-shell --master spark://bigdata11:7077 --jars /root/temp/ojdbc6.jar --driver-class-path /root/temp/ojdbc6.jar // 读取 Oracle
val oracleEmp = spark.read.format("jdbc")
.option("url","jdbc:oracle:thin:@192.168.10.100:1521/orcl.example.com")
.option("dbtable","scott.emp")
.option("user","scott")
.option("password","tiger").load

  

 

    ---> 操作 Hive 的表

        ---- 把 hive 和 hadoop 的配置文件拷贝到sprke 的 conf 目录下: hive-sit.xml, core-sit.xml, hdfs-sit.xml

        ---- 启动 Spark-shell 时 指定mysql 数据库的驱动程序

./bin/spark-shell --master spark://bigdata0:7077 --jars /data/tools/mysql-connector-java-5.1.43-bin.jar  --driver-class-path /data/tools/mysql-connector-java-5.1.43-bin.jar
 

        ---- 使用 Spark Shell 操作 Hive

// 创建表
spark.sql("create table ccc(key INT, value STRING) row format delimited fields terminated by ','") // 导入数据
spark.sql("load data local path '/test/data.txt' into table ccc") // 查询数据
spark.sql("select * from ccc").show

  

 

        ---- 使用 Spark SQL 操作 Hive

show tables;
select * from ccc;

  

 

 

Parquet介绍及简单使用(转)的更多相关文章

  1. 【转载】Ssh整合开发介绍和简单的登入案例实现

    Ssh整合开发介绍和简单的登入案例实现 Ssh整合开发介绍和简单的登入案例实现 一  介绍: Ssh是strtus2-2.3.1.2+ spring-2.5.6+hibernate-3.6.8整合的开 ...

  2. python模块介绍- HTMLParser 简单的HTML和XHTML解析器

    python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...

  3. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  4. WebRTC介绍及简单应用

    WebRTC介绍及简单应用 WebRTC,即Web Real-Time Communication,web实时通信技术.简单地说就是在web浏览器里面引入实时通信,包括音视频通话等. WebRTC实时 ...

  5. 1. pyhanlp介绍和简单应用

    1. pyhanlp介绍和简单应用 2. 观点提取和聚类代码详解 1. 前言 中文分词≠自然语言处理! 中文分词只是第一步:HanLP从中文分词开始,覆盖词性标注.命名实体识别.句法分析.文本分类等常 ...

  6. C#串口介绍以及简单串口通信程序设计实现

    C#串口介绍以及简单串口通信程序设计实现 周末,没事干,写个简单的串口通信工具,也算是本周末曾来过,废话不多,直接到主题 串口介绍 串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口) ...

  7. 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...

  8. 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

    进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...

  9. 进击的Python【第十一章】:消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queu ...

随机推荐

  1. 服务器架构前面加了防火墙,Nginx如何获取客户端真实ip???

    在大部分实际业务场景中,网站访问请求并不是简单地从用户(访问者)的浏览器直达网站的源站服务器,中间可能经过所部署的CDN.高防IP.WAF等代理服务器.例如,网站可能采用这样的部署架构:用户 > ...

  2. ls - 列出目录清单信息

    ls - list directory contents 列出目录内容 格式: ls [OPTION]... [FILE]... 常用选项: -a:显示所有文件或目录(包括隐藏目录和.(当前目录),. ...

  3. 网络服务-SAMBA

    1. Samba 概述 SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内不同操作系统的计算机之间提供文件及打印机等资源的共享 ...

  4. Tessy — 嵌入式软件单元测试/ 集成测试工具

    Tessy 源自戴姆勒- 奔驰公司的软件技术实验室,由德国Hitex 公司负责全球销售及技术支持服务,是一款专门针对嵌入式软件进行单元/ 集成测试的工具.它可以对C/C++ 代码进行单元.集成测试,可 ...

  5. 算法 dfs 二叉树的所有路径

    480. 二叉树的所有路径 给一棵二叉树,找出从根节点到叶子节点的所有路径. Example 样例 1: 输入:{1,2,3,#,5} 输出:["1->2->5",&q ...

  6. c# 调用 C++ dll 传入传出类型对应说明(转)

    由于经常使用C#调用 非托管C++ dll 操作一下硬件,出现传入传出类型的问题,现整理了C++ dll 类型与 C#类型对应关系: //C++中的DLL函数原型为        //extern & ...

  7. Could not resolve com.android.support:design 28.0.0

    想试一试android的那个侧滑栏功能,需要用到 'com.android.support:design:28.0.0'建好之后一直报关于28.00的错误,一开始各种百度更改配置没吊用,最后感觉是网络 ...

  8. ModelMetadataProviders 获取类型元数据

    var aa = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(LogModel)).Properties;

  9. Dockerfile 常见指令的意义/常见的使用方式/使用示例/

    一.什么是 Dockerfile ? Dockerfile 就是生成docker镜像的指令集, 通过使用docker工具执行这些指令集可以方便快捷地生成镜像, 并且能不断复用 Dockerfile 指 ...

  10. nginx常用运维日志分析命令

    nginx常用日志分析命令 运维人员必备 常用日志分析命令 1.总请求数 wc -l access.log |awk '{print $1}' 2.独立IP数 awk '{print $1}' acc ...