美文网首页
PySpark存储Hive数据的两种方式

PySpark存储Hive数据的两种方式

作者: 小甜瓜Melon | 来源:发表于2017-07-21 10:40 被阅读0次

背景:Hive的CREATE TABLE AS 和PySpark的.write.saveAsTable存储之后产生的数据类型并不一样,前者存储的方式是Text形式的,后者的存储形式是parquet形式。

示例

原始数据的类型

hiveContext.sql("SHOW CREATE TABLE testdb.tttest").show(n=1000, truncate=False)
+--------------------------------------------------------------+
|result                                                        |
+--------------------------------------------------------------+
|CREATE TABLE `testdb.tttest`(                                 |
|  `username` string,                                          |
|  `sex` string)                                               |
|COMMENT 'Imported by sqoop on 2017/04/17 10:11:26'            |
|ROW FORMAT SERDE                                              |
|  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'        |
|WITH SERDEPROPERTIES (                                        |
|  'field.delim'='\t',                                         |
|  'line.delim'='\n',                                          |
|  'serialization.format'='\t')                                |
|STORED AS INPUTFORMAT                                         |
|  'org.apache.hadoop.mapred.TextInputFormat'                  |
|OUTPUTFORMAT                                                  |
|  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'|
|LOCATION                                                      |
|  'hdfs://nameservice1/user/hive/warehouse/testdb.db/tttest'  |
|TBLPROPERTIES (                                               |
|  'COLUMN_STATS_ACCURATE'='true',                             |
|  'numFiles'='1',                                             |
|  'numRows'='0',                                              |
|  'rawDataSize'='0',                                          |
|  'totalSize'='66',                                           |
|  'transient_lastDdlTime'='1492395090')                       |
+--------------------------------------------------------------+

源数据为Text形式

方式一:利用Hive的CREATE TABLE AS存储

hiveContext.sql("DROP TABLE IF EXISTS testdb.test_a")
hiveContext.sql("""CREATE TABLE IF NOT EXISTS testdb.test_a AS SELECT * FROM testdb.tttest""")
hiveContext.sql("SHOW CREATE TABLE testdb.test_a").show(n=1000, truncate=False)
+------------------------------------------------------------+
|result                                                      |
+------------------------------------------------------------+
|CREATE TABLE `testdb.test_a`(                               |
|  `username` string,                                        |
|  `sex` string)                                             |
|ROW FORMAT SERDE                                            |
|  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'      |
|STORED AS INPUTFORMAT                                       |
|  'org.apache.hadoop.mapred.TextInputFormat'                |
|OUTPUTFORMAT                                                |
|  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'  |
|LOCATION                                                    |
|  'hdfs://nameservice1/user/hive/warehouse/testdb.db/test_a'|
|TBLPROPERTIES (                                             |
|  'COLUMN_STATS_ACCURATE'='false',                          |
|  'numFiles'='2',                                           |
|  'numRows'='-1',                                           |
|  'rawDataSize'='-1',                                       |
|  'totalSize'='66',                                         |
|  'transient_lastDdlTime'='1500603886')                     |
+------------------------------------------------------------+

方式二:利用PySpark的.write.saveAsTable存储

hiveContext.sql("DROP TABLE IF EXISTS testdb.test_b")
hiveContext.sql("""SELECT * FROM testdb.tttest""").write.saveAsTable("testdb.test_b")
hiveContext.sql("SHOW CREATE TABLE testdb.test_b").show(n=1000, truncate=False)
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|result                                                                                                                                                                                                                           |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|CREATE TABLE `testdb.test_b`(                                                                                                                                                                                                    |
|  `username` string COMMENT '',                                                                                                                                                                                                  |
|  `sex` string COMMENT '')                                                                                                                                                                                                       |
|ROW FORMAT SERDE                                                                                                                                                                                                                 |
|  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'                                                                                                                                                                  |
|WITH SERDEPROPERTIES (                                                                                                                                                                                                           |
|  'path'='hdfs://nameservice1/user/hive/warehouse/testdb.db/test_b')                                                                                                                                                             |
|STORED AS INPUTFORMAT                                                                                                                                                                                                            |
|  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'                                                                                                                                                                |
|OUTPUTFORMAT                                                                                                                                                                                                                     |
|  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'                                                                                                                                                               |
|LOCATION                                                                                                                                                                                                                         |
|  'hdfs://nameservice1/user/hive/warehouse/testdb.db/test_b'                                                                                                                                                                     |
|TBLPROPERTIES (                                                                                                                                                                                                                  |
|  'COLUMN_STATS_ACCURATE'='false',                                                                                                                                                                                               |
|  'EXTERNAL'='FALSE',                                                                                                                                                                                                            |
|  'numFiles'='2',                                                                                                                                                                                                                |
|  'numRows'='-1',                                                                                                                                                                                                                |
|  'rawDataSize'='-1',                                                                                                                                                                                                            |
|  'spark.sql.sources.provider'='org.apache.spark.sql.parquet',                                                                                                                                                                   |
|  'spark.sql.sources.schema.numParts'='1',                                                                                                                                                                                       |
|  'spark.sql.sources.schema.part.0'='{\"type\":\"struct\",\"fields\":[{\"name\":\"username\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"sex\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]}', |
|  'totalSize'='1308',                                                                                                                                                                                                            |
|  'transient_lastDdlTime'='1500603889')                                                                                                                                                                                          |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Tips
第一种方式有时会产生乱码,对于大型的表最好采用第二种方式进行存储,不容易产生乱码。

删除新建的两个表

hiveContext.sql("DROP TABLE testdb.test_a PURGE")
hiveContext.sql("DROP TABLE testdb.test_b PURGE")

完。

相关文章

  • PySpark存储Hive数据的两种方式

    背景:Hive的CREATE TABLE AS 和PySpark的.write.saveAsTable存储之后产生...

  • pyspark

    1.在 pyspark 上运行sql,查看数据异常 运行 sql 查看查询出来的数据类型 直接读取hive中存储的...

  • Hive知识汇总

    两种Hive表 hive存储:数据+元数据 托管表(内部表) 创建表: 准备数据文件my.txt 灌数据: 查看数...

  • hive搭建方式概览

    hive三种方式区别和搭建 Hive中metastore(元数据存储)的三种方式: a)内嵌Derby方式 b)L...

  • 大数据之Hive03-分区partition详解(静态分区,动态

    一、前言 Hive分区是为了方便数据管理Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一...

  • 大数据开发:Hive列式存储ORC、Parquet的优点

    众所周知,作为Hive列式存储提供了高性能的存储方式,面对大规模的数据存储任务,也能高效快速地完成,这也是Hive...

  • PySpark SQL常用语法

    许多数据分析师都是用HIVE SQL跑数,这里我建议转向PySpark: PySpark的语法是从左到右串行的,便...

  • hive数据文件存储格式

    在hive中有数据存储文件格式有四种,在此主要介绍ORCFile: 列式存储ORCFile存储方式:数据按行分块,...

  • Hive的安装

    我们使用mysql来存储hive的元数据(metadata),这里关于元数据以及元数据的存储方式摘录了这篇文章里的...

  • 大数据 - Hive

    大数据 - Hive hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储...

网友评论

      本文标题:PySpark存储Hive数据的两种方式

      本文链接:https://www.haomeiwen.com/subject/hjiskxtx.html