热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PySpark存储Hive数据的两种方式

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

背景: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")

完。


推荐阅读
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 本文详细介绍了如何使用C#实现不同类型的系统服务账户(如Windows服务、计划任务和IIS应用池)的密码重置方法。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文详细介绍了 Spark 中的弹性分布式数据集(RDD)及其常见的操作方法,包括 union、intersection、cartesian、subtract、join、cogroup 等转换操作,以及 count、collect、reduce、take、foreach、first、saveAsTextFile 等行动操作。 ... [详细]
  • UVa 11683: 激光雕刻技术解析
    自1958年发明以来,激光技术已在众多领域得到广泛应用,包括电子设备、医疗手术工具、武器等。本文将探讨如何使用激光技术进行材料雕刻,并通过编程解决一个具体的激光雕刻问题。 ... [详细]
  • 本文介绍了如何通过安装和配置php_uploadprogress扩展来实现文件上传时的进度条显示功能。通过一个简单的示例,详细解释了从安装扩展到编写具体代码的全过程。 ... [详细]
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • Excel技巧:单元格中显示公式而非结果的解决方法
    本文探讨了在Excel中如何通过简单的方法解决单元格显示公式而非计算结果的问题,包括使用快捷键和调整单元格格式两种方法。 ... [详细]
  • 本文介绍了如何在 Oracle 数据库中查询重复数据,并提供了多种方法来筛选和删除重复记录,包括基于单个字段和多个字段的重复数据处理。 ... [详细]
  • 本文详细解析了MySQL中常见的几种错误,并提供了具体的解决方法,帮助开发者快速定位和解决问题。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • Spark中使用map或flatMap将DataSet[A]转换为DataSet[B]时Schema变为Binary的问题及解决方案
    本文探讨了在使用Spark的map或flatMap算子将一个数据集转换为另一个数据集时,遇到的Schema变为Binary的问题,并提供了详细的解决方案。 ... [详细]
author-avatar
茫茫人海啊啊啊_574
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有