spark解析压缩包数据,写入到hive表中

配置Spark 3以连接Hive 1.2.1版本的压缩文件库 在大数据生态中,Hive是一个常用于存储、查询和分析大规模数据集的工具。Hive 1.2.1版本作为一个稳定的版本,在许多企业中有着广泛的应用。该版本的JAR文件压缩包包含了Hive运行所需的所有依赖库,是部署Hive环境的基石。Hive 1.2.1版本引入了许多重要的改进和新特性,例如支持更多的HiveQL语法,优化了查询性能,增强了分区管理,以及提升了与外部系统的兼容性。这些特性使Hive成为处理大数据的关键组件之一。 阅读详情

spark解析xxxxx.tar.gz形式的压缩包。
压缩包里面是一个个的json文件或者zip的文件,zip里面是json文件。先用spark读取tar.gz的路径,然后开流传给 new TarArchiveInputStream(new GZIPInputStream(file))去处理,大概的代码如下

def main(args: Array[String]): Unit = {
    val root: String = args(0)   // xxx.tar.gz的路径
    val stname = "test/"  //压缩包里读取的文件名
    val startday =args(2)   //压缩包里是多天的文件,这就需要获取一天的所需文件的数据,插入到hive按天分区的表中
    val endday=args(3)   

    val spark = SparkSession.builder()
      .appName(s"$stname")
      .enableHiveSupport()
      .getOrCreate()
    val sc = spark.sparkContext
    import spark.implicits._
    val days: Array[String] = DataUtils.dataextent(startday,endday)  //先按照日期进行遍历每一天的文件夹
    for (daytemp <- days) {
      val filename: String = daytemp+"/"+stname
      val day: String = daytemp.substring(0,4)+daytemp.substring(5,7)+daytemp.substring(8,10)
      val filerdd: RDD[(String, PortableDataStream)] = sc.binaryFiles(s"${root}") 
      filerdd.flatMap(file=>{
        TargzUtils.tarfile(file._2.open(),filename)
      }).flatMap(json => JsonUtil.parseArray[testbean](json)).toDS()
        .createOrReplaceTempView("t1")
      spark.sql(
        s"""
           |insert into table default.test partition(day='$day')
           |select * from t1
           |""".stripMargin)

    }
  }
def tarfile(file:InputStream,filename:String) ={
    var inputStream : ArchiveInputStream = null
    val lines = new ListBuffer[String]
    try {
      inputStream = new TarArchiveInputStream(new GZIPInputStream(file))
      var entry : TarArchiveEntry = null
      while ({
        entry = inputStream.getNextEntry.asInstanceOf[TarArchiveEntry]
        entry
      }!=null){
        if (!entry.isDirectory){
          if (entry.getName.endsWith(".zip")&&entry.getName.contains(filename)){
            println(entry.getName)
            val zipInputStream =  new ZipInputStream(inputStream)
            var zipEntry : ZipEntry = null
            try {
              while ({
                zipEntry = zipInputStream.getNextEntry
                zipEntry
              }!= null){
                if (zipEntry.getName.endsWith(".json")){
                  println(zipEntry.getName)
                  lines.append(streamToString(zipInputStream))
                }
              }
            }catch {
              case e : ZipException =>
                e.printStackTrace()
            }
          } else if (entry.getName.endsWith(".json")&&entry.getName.contains(filename)){
            println(entry.getName)
            lines.append(streamToString(inputStream).trim)
          }
        }
      }
      lines.toList
    }catch {
      case _: Exception => lines.toList
    }finally {
      inputStream.close()
    }
  }
    def streamToString(inputStream: InputStream): String = {
    val bufferedReader = new BufferedReader(new InputStreamReader(inputStream))
    val result = new StringBuilder()
    var buffer: String = null
    while ( {
      try {
        buffer = bufferedReader.readLine()
      } catch {
        case e: Exception =>
          e.printStackTrace()
          buffer = null
      }
      buffer
    } != null) {
      result.append(buffer.trim)
    }
    result.toString()
  }
  // 输入起始日期,终止日期,得到这中间的所有日期的集合
  def dataextent(startday:String,endday:String):Array[String] ={
    val df = new SimpleDateFormat("yyyy-MM-dd")
    val date1: Date = df.parse(startday)
    val date2: Date = df.parse(endday)
    val startcal: Calendar = Calendar.getInstance()
    val endcal: Calendar = Calendar.getInstance()
    startcal.setTime(date1)
    endcal.setTime(date2)
    val startmi: Long = startcal.getTimeInMillis
    val endmi: Long = endcal.getTimeInMillis
    val oneday: Long = 1000*60*60*24L
    var time:Long = startmi
    val listbuf = new ListBuffer[String]
    while (time<=endmi){
      val date = new Date(time)
      val day: String = df.format(date)
      listbuf.append(day.trim)
      time += oneday
    }
   listbuf.toArray
  }
  def parse[T](json: String)(implicit m: Manifest[T]): Option[T] = {
    try {
      implicit val formats: Formats = DefaultFormats
      val objJValue = parseJson(json).transformField { case (field, value) => (field.toLowerCase, value) }
      Option(objJValue.extract[T])
    } catch {
      case e: Exception =>
        e.printStackTrace()
        None
    }
  }

  def parseArray[T](json: String)(implicit m: Manifest[T]): Array[T] = {

      implicit val formats: Formats = DefaultFormats
      val objJValue = parseJson(json)
      objJValue.extract[Array[T]]

  }
case class testbean(
                     `type`: Option[String],
                     id: Option[String] ,
                     name: Option[String] 
                   )
天气数据离线数仓实战:Hadoop+Hive+Spark+Spring Boot全链路解析 数据可视化是大数据应用的重要出口,但真实场景中,数据往往需要经过采集、存储、清洗、分析才能呈现。离线数仓作为承载这一流程的核心架构,将Hadoop分布式存储、Hive表建模与Spark内存计算串联起来,为海量数据提供稳定的批处理能力。理解从原始数据到可查询指标的转化过程,是构建数据产品的关键。本文以天气数据为示例,完整演示了Python爬虫采集城市气象信息、上传HDFS、建立Hive外部表、Spark聚合分析并回写MySQL,最终通过Spring Boot接口交由ECharts渲染全国热力图的工程链路。这一 阅读详情

相关推荐

基于Hadoop+Hive+Spark的收视率分析系统设计与实现

大数据技术体系中,离线批处理是最基础且应用最广的分析模式,Hadoop分布式存储、Hive数据仓库和Spark内存计算共同构成了这类系统的核心骨架。HDFS负责海量原始日志的可靠存储,Hive通过分层建模将非结构化数据映射为可管理的表结构,Spark则利用内存计算加速复杂指标加工,三者协同实现从数据接入到指标输出的完整链路。在用户行为分析、内容运营统计等场景中,这套架构能够有效应对千万级日志的存储与计算压力,同时通过分区裁剪、数据倾斜优化等手段保障性能稳定。本文以收视率分析系统为例,完整展示了从组件选型、数

weixin_34234721的博客 307

将本地文件导入到Hive表中(支持 TEXTFILE 、ORC 等存储格式)

1、hive表格式为TEXTFILE 由于 TEXTFILE 格式没有对数据进行压缩,因此直接 load 即可。 假设本地有一个文件 test_person.txt,内容为: Gong 24 Tian 23 1 2 想要将其导入到 TEXTFILE 格式的 tmp_test_person_txt 表内,步骤如下: 1.1、创建目标表,格式为 TEXTFILE 在 hive 命令行下,输入建表语句: CREATE TABLE tmp.tmp_test_person_txt(name str...

运维老兵的专栏 6539

Spark 2.3.0 without-hive深度解析:部署、Hive集成与YARN调优

大数据处理框架中,Apache Spark凭借内存计算与统一分析引擎成为企业级数据仓库建设的核心组件。Spark发行版的命名规则暗含版本、编译目标与依赖信息,理解“without-hive”与“hadoop2”等标识是正确部署的前提。通过外部Hive Metastore服务,Spark SQL能够与既有数仓无缝集成,避免内置Derby带来的多会话限制。在YARN资源调度下,合理配置内存模型与JVM参数可显著提升任务稳定性,规避Container被kill等典型问题。文章从实际运维视角拆解Spark 2.3.

weixin_33552698的博客 276

HIVE实战处理(六)hive的压缩格式以及压缩文件导入hive实战

一、存储 行存储的特点: 查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。 列存储的特点: 因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。 Hive中常用的存储格式: 1....

sheep8521的博客 4756

基于Spark+Kafka+Hive的智能货运系统:从.dat日志到Hive报表全链路实战

大数据流处理与数仓技术是构建实时数据管道的基础,其核心原理是通过消息队列解耦数据生产与消费,利用分布式计算引擎进行流式清洗与聚合,最终落地到列式存储的数仓中,实现高效查询与分析。在物流车联网场景下,该技术能实时处理车辆GPS日志,计算超速、路线偏移等指标,支撑调度报表与监控看板。本文围绕智能货运系统,详解Kafka主题设计、Spark Streaming消费语义、Hive分区表优化及小文件合并等工程实践,帮助读者掌握从原始.dat文件到Hive数据资产的完整链路。

weixin_29053695的博客 137

Hadoop 大数据入门实战:从环境搭建到 HDFS、Hive、Spark 与 Flink 链路验证

大数据处理的核心在于分布式存储与计算,HDFS 负责数据可靠存储,YARN 负责资源调度,Hive 提供 SQL 查询能力,Spark 和 Flink 则承担批流计算任务。理解这些组件的基本原理与协作方式,是构建数据仓库和实时链路的基础。在实际工程中,环境搭建、集群配置、组件集成与数据验证往往决定项目能否跑通。本文围绕 Hadoop 生态,结合 dept.csv 等测试数据,梳理从 HDFS 上传、Hive 建表到 Spark SQL 聚合的完整验证链路,并覆盖 Kafka、Flume、Flink 等实时组

weixin_29034963的博客 172

hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)

数据做压缩和解压缩总会增加CPU的开销,但可以最大程度的减少文件所需的磁盘空间和网络I/O的开销 最好对那些I/O密集型的作业使用数据压缩 hive表的存储格式为     TEXTFILE     SEQUENCEFILE(三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩)     RCFILE     自定义格式

longshenlmj的专栏 2万+

大数据全家桶搭建指南:Hadoop、Hive、Spark、Flink 依赖顺序与避坑

分布式系统依赖协调服务与存储底座,Zookeeper 和 Hadoop 提供基础协调与存储能力,Hive 通过 Metastore 实现元数据管理,Spark 和 Flink 作为计算引擎读写 Hive 与 Kafka。理解组件依赖顺序是搭建大数据集群的关键,从存储、计算到消息链路,合理规划端口与内存可避免常见冲突。典型应用场景包括离线数仓、实时流处理与日志采集。本文围绕 Hadoop、Hive、Spark、Flink 的串联实践,梳理从环境准备到联调避坑的完整路径。

weixin_29057065的博客 257

python 读取kafka 写hive_使用 spark 从 kafka 消费数据写入 hive 动态分区表(一)

使用 spark 从 kafka 消费数据写入 hive 动态分区表最近因为业务需求,需要把 kafka 内的数据写入 hive 动态分区表,进入 kafka 的数据是保证不会重复的,同一条业务数据仅会进入 kafka 一次。这就保证数据到了 hive 基本不会发生 update 操作,可以对 hive 进行统计生成静态表的形式将统计数据写入 MySQL。咱也不说那么多废话了,开整。直接写入从 k...

weixin_39806413的博客 1001

大数据技术深度解析:Spark、HBase、HDFS二次开发课程

简介:本压缩包资料包含了关于大数据技术深度学习的PPT和PDF文档,重点介绍了Spark、HBase、HDFS等技术的二次开发细节。涵盖从核心框架到周边技术,如Hive、Kafka、Solr、MapReduce等,强调二次开发实践以及与之相关的编程和架构设计。文档中还包含了FusionInsight应用开发、Scala编程等重要知识点,旨在帮助专业技术人员提升在大数据领域的专业技能。

weixin_29301059的博客 832

SAP ABAP MIGO增强实战:自定义页签与字段的完整实现指南

本文详细介绍了SAP ABAP中MIGO增强的实战指南,包括自定义页签与字段的完整实现步骤。通过BADI增强技术,开发者可以快速满足企业个性化需求,如添加供应商批次号等特殊字段。文章涵盖数据存储结构设计、BADI框架实现、核心方法编写及数据持久化方案,帮助用户高效完成MIGO屏幕增强开发。

study的专栏 774

Spark:读取文本文件存为hive表最佳实践

存储表的时候,由以下几点要注意: 写入hive表前用coalesce方法对原始数据进行重新分区。 因为读取的数据一般是纯文本,写入hive中的默认是用snappy压缩过的parquet(.snappy.parquet),所以分区数如果保持原来的话可能会造成每个.snappy.parquet文件只有20~30MB大小,一般将分区数除以3或4左右即可。 ...

weixin_33893473的博客 1400

高通410随身WiFi刷OpenWRT与Debian双系统一键集成方案

本文详细介绍高通410随身WiFi设备刷入OpenWRT与Debian双系统的一键集成方案。通过虎王工作室提供的一键刷机包,用户可轻松实现双系统部署,兼顾OpenWRT的网络功能与Debian的完整应用服务,适用于网络加速、服务器部署等多种场景,并提供了硬件资源分配与系统切换的实用指南。

docker7nomad的博客 1135

Hive3.1.2整合Spark3.0.0-HiveOnSpark

一,整合原理 1,HiveOnSpark Hive是一个Sql解析引擎,其不具备计算能力,Hive将Sql解析成为物理执行计划,将物理执行计划交由计算引擎执行计算,默认的执行引擎是MapReduce,但MapReduce执行速度慢,随着Spark的崛起,Hive也支持使用Spark作为计算引擎,这就是HiveOnSpark 2,SparkOnHive 比较容易混淆,二者差距还是很大的,SparkOnHive只是使用了Hive的元数据服务,Sql解析由Spark完成、计算也由Spark完成。 二,整合步骤

epitomizelu的专栏 7488

深入浅出卡尔曼滤波器算法

深入浅出讲解卡尔曼滤波器的工作原理及其公式推导,讨论卡尔曼滤波器的核心公式所代表的意义及个人的理解。

m0_37835056的博客 1364

MATLAB实战:手把手教你搭建构网逆变器同步稳定性仿真模型(附避坑指南)

本文详细介绍了如何在MATLAB/Simulink平台上搭建构网逆变器同步稳定性仿真模型,涵盖从基础模块配置到虚拟同步机控制实现的完整流程。针对电力电子工程师常见的控制参数整定困难、仿真结果偏差等问题,提供了LCL滤波器谐振抑制、虚拟惯量优化等关键技术解决方案,并附有避坑指南和工程实践技巧,助力研究者高效完成仿真建模。

weixin_29051193的博客 296

从Hive到Spark

Hive概述 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,将类 SQL 语句转换为 MapReduce 任务执行。 Hive产生背景 MapReduce编程带来的不便性 MapReduce编程十分繁琐,在大多情况下,每个MapReduce程序需要包含Mapper、Reduceer和一个Drive...

GIS摆渡人 964

WSL2不能上网,Failed to connect to github.com port 443问题解决方案

WSL2不能上网: 问题:ping外网无效 例如:ping www.baidu.com失败 解决方案: 在wsl: $sudo vi /etc/wsl.conf wsl.conf: [network] generateResolvConf = false 在PowerShell: $sudo vi /etc/etc/resolv.conf resolv.conf: # This file was automatically generated by WSL. To stop automatic gen

Jason_Chen__的博客 9525

hive中spark SQL做算子引擎,PG作为MetaDatabase

hive架构原理1.客户端可以采用jdbc的方式访问hive2.客户端将编写好的HQL语句提交,经过SQL解析器,编译器,优化器,执行器执行任务。hive的存算都依赖于hadoop框架,所依赖的真实数据存放在hdfs中,解析好的mapreduce程序,提交给yarn。3.另外hive框架自带一个名为debay的数据库,其作用是用来记录hdfs上数据的存放位置,也就是说,在客户端提交任务之后,hive优先会去数据库中查询所需要数据在hdfs上面的路径信息,然后在拿着路径信息再去hdfs寻找数据。

weixin_73350116的博客 1145

小爱音箱Play增强版刷机接入大模型:自定义唤醒词与远程控制全攻略

智能音箱作为家庭语音入口,受限于厂商预设技能,难以满足个性化需求。通过串口刷机与Linux系统分区改造,可以完全掌控设备底层,将豆包、通义千问等大模型API接入原有音频链路,实现真正智能的语音问答。自定义唤醒词打破了“小爱同学”的唯一唤醒方式,结合ESP32-S3外挂模块,还能优化远场拾音。更深入的应用在于将音箱打造为家庭中控,通过大模型工具调用解析自然语言指令,实现远程控制电脑、智能灯等设备。本文从设备选型、拆机串口、系统备份到语音链路搭建,完整梳理了小爱音箱Play增强版的改造路径,适合具备动手能力的开

weixin_30036289的博客 705

【SpringBoot 3.x 第92节】Spring Modulith:构建模块化单体架构(基于 Spring Boot 3),一文带你搞透(超详细)!

🏆本文收录于《滚雪球学SpringBoot 3.x》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    该专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。

**My Coding Family** 997

spark 异常记录

spark启动异常:Caused by: java.net.NoRouteToHostException: No route to host (Host unreachable) Caused by: java.net.NoRouteToHostException: No route to host (Host unreachable) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.A

风子的博客 711

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spark学习笔记:Spark基础

Spark基础以及WordCount实现

lrxcmwy2的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

基于Docker搭建大数据集群(六)Hive搭建

前言 之前搭建的都是1.x版本,这次搭建的是hive3.1.2版本的。。还是有一点细节不一样的 Hive现在解析引擎可以选择spark,我是用spark做解析引擎的,存储还是用的HDFS 我是在docker里面搭建的集群,所以都是基于docker操作的 一、安装包准备 Hive官网下载 微云下载 | 在 tar 目录下 二、版本兼容 我使用的相关软件版本 Hadoop ~ 2.7...

程序员朱永胜 835

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: scala遍历hdfs上的文件,传给sparksql写入到hive的分区表
下一篇: 关于递归回溯算法的案例(8皇后问题案例)
dbbigdata
博客等级 码龄7年 8粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值