![](https://img-blog.csdnimg.cn/20191221151448464.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Spark
文章平均质量分 65
Spark
大数据学习与分享
【微信公众号:大数据学习与分享】专注于大数据领域常用技术,如Spark、Hadoop、Hive、HBase、Kafka、Zookeeper等技术的使用、实战技巧、源码解读,语言主要以Java和Scala为主
展开
-
如何使用spark或者hive sql将Excel文件加载为一张hive表
一、Spark实现方案1. 创建Hive外部表, 数据保存格式为parquetcreate external table `bigdatalearnshare.test_excel_file`(`id` string,`name` string,`age` string)stored as parquetlocation '/bigdatalearnshare/test/test_excel_file';2. spark代码demospark版本: 2.4.3scala版本: 2.11原创 2022-04-16 22:18:04 · 2878 阅读 · 0 评论 -
Spark SQL和Hive中的函数(五):SparkSQL函数算子
本系列文章主要介绍Spark SQL/Hive中常用的函数,主要分为字符串函数、JSON函数、时间函数、开窗函数以及在编写Spark SQL代码应用时实用的函数算子五个模块。本篇文章主要介绍SparkSQL函数算子。之前介绍的函数都是可以直接在SQL中应用的。那么如果是在Spark SQL的DataFrame/DataSet的算子中调用,可以参考DataFrame/DataSet的算子以及org.apache.spark.sql.functions._下的函数:关联文章:经典的SparkSQL/原创 2021-03-30 09:14:03 · 331 阅读 · 0 评论 -
Spark SQL和Hive中的函数(四)常用的开窗函数
开窗函数格式通常满足:function_name([argument_list])OVER ([PARTITION BY partition_expression,…][ORDER BY sort_expression, … [ASC|DESC]])function_name: 函数名称,比如SUM()、AVG()partition_expression:分区列sort_expression:排序列注意:以下举例涉及的表employee中字段含义:name(员工姓名)、dept_no(部门原创 2021-03-23 11:13:16 · 566 阅读 · 0 评论 -
Spark SQL和Hive中的函数(三):时间函数
1. current_date / current_timestamp获取当前时间select current_date;select current_timestamp;2. 从日期时间中提取字段/格式化时间1)year、month、day、dayofmonth、hour、minute、second-- 20select day("2020-12-20");2)dayofweek(1 = Sunday, 2 = Monday, …, 7 = Saturday)、dayofyear--原创 2021-03-17 09:01:16 · 1025 阅读 · 0 评论 -
Spark SQL和Hive中的函数(二):JSON函数
1. get_json_object-- v2select get_json_object('{"k1": "v1", "k2": "v2"}', '$.k2');2. from_jsonselect tmp.k from (select from_json('{"k": "fruit", "v": "apple"}','k STRING, v STRING', map("","")) as tmp);这个方法可以给json定义一个Schema,这样在使用时,就可以直接使用a.k这种方式原创 2021-03-16 11:33:27 · 1980 阅读 · 0 评论 -
Spark SQL和Hive中的函数(一):字符串函数
本系列文章主要介绍Spark SQL/Hive中常用的函数,主要分为字符串函数、JSON函数、时间函数、开窗函数以及在编写Spark SQL代码应用时实用的函数算子五个模块。1. concat对字符串进行拼接:concat(str1, str2, …, strN) ,参数:str1、str2…是要进行拼接的字符串。-- return the concatenation of str1、str2、..., strN-- SparkSQLselect concat('Spark', 'SQL');原创 2021-03-12 09:30:21 · 1176 阅读 · 0 评论 -
Spark推荐系统实践
推荐系统是根据用户的行为、兴趣等特征,将用户感兴趣的信息、产品等推荐给用户的系统,它的出现主要是为了解决信息过载和用户无明确需求的问题,根据划分标准的不同,又分很多种类别:根据目标用户的不同,可划分为基于大众行为的推荐引擎和个性化推荐引擎根据数据之间的相关性,可划分为基于人口统计学的推荐和基于内容的推荐…通常,我们在讨论推荐系统时主要是针对个性化推荐系统,因为它才是更加智能的信息发现过程。在个性化推荐系统中,协同过滤算法是目前应用最成功也是最普遍的算法,主要包括两大类,基于用户的协同过滤原创 2021-01-12 10:56:30 · 2699 阅读 · 1 评论 -
Spark SQL处理decimal类型空指针异常(spark.sql.hive.convertMetastoreParquet)
系列三在此之前可以先阅读文章:SparkSQL与Hive metastore Parquet转换但如果同时设置spark.sql.hive.convertMetastoreParquet为false时,要注意一些数据类型以及精度的处理,比如对于decimal类型的处理。通过一个例子复原一下当时的场景:1.创建Hive外部表testdb.test_decimal,其中字段fee_rate为decimal(10,10)CREATE EXTERNAL TABLE `testdb`.`test_decima原创 2020-11-06 09:22:18 · 2033 阅读 · 0 评论 -
spark.sql.parquet.writeLegacyFormat:ParquetDecodingException: Can not read value at 0 in block -1 in
系列二在此之前可以先阅读文章:SparkSQL与Hive metastore Parquet转换在说问题之前首先了解一个参数spark.sql.parquet.writeLegacyFormat(默认false)的作用:设置为true时,数据会以Spark1.4和更早的版本的格式写入。比如decimal类型的值会被以Apache Parquet的fixed-length byte array格式写出,该格式是其他系统例如Hive、Impala等使用的。设置为false时,会使用parquet的新版格原创 2020-11-06 09:18:10 · 2976 阅读 · 1 评论 -
SparkSQL与Hive metastore Parquet
Spark SQL为了更好的性能,在读写Hive metastore parquet格式的表时,会默认使用自己的Parquet SerDe,而不是采用Hive的SerDe进行序列化和反序列化。该行为可以通过配置参数spark.sql.hive.convertMetastoreParquet进行控制,默认true。这里从表schema的处理角度而言,就必须注意Hive和Parquet兼容性,主要有两个区别:Hive是大小写敏感的,但Parquet相反Hive会将所有列视为nullable,但是原创 2020-11-03 18:16:50 · 1373 阅读 · 0 评论 -
SparkSQL: Cannot have map type columns in DataFrame which calls set operations(intersect, except,
通过SparkSQL,对两个存在map类型字段的Hive表进行union操作,报如下错误:org.apache.spark.sql.AnalysisException: Cannot have map type columns in DataFrame which calls set operations(intersect, except, etc.), but the type of column map is map<string,string>;1. 场景模拟1)通过函数str_原创 2020-11-01 11:22:48 · 3002 阅读 · 0 评论 -
SparkSQL存储数据到Parquet:AnalysisException: Parquet data source does not support null data type.
使用SparkSQL(2.4版本)往存储格式为parquet的Hive分区表中存储NullType类型的数据时报错:org.apache.spark.sql.AnalysisException: Parquet data source does not support null data type.虽然在Stack OverFlow上找到了类似的问题,但没有具体阐明到底是什么原因导致了这种问题以及如何解决?1.场景模拟1)创建temp view:test_viewsparkSession.sql原创 2020-10-30 20:06:14 · 3825 阅读 · 1 评论 -
学好Spark必须要掌握的Scala技术点(一)变量、表达式、循环、Option、方法和函数/偏函数
前言Scala是以JVM为运行环境的面向对象的函数式编程语言,它可以直接访问Java类库并且与Java框架进行交互操作。正如之前所介绍,Spark是用Scala语言编写的,Kafka server端也是,那么深入学习Scala对掌握Spark、Kafka是必备掌握技能。本篇文章主要介绍,在学习、编写Spark程序时,至少要掌握的Scala语法,多以示例说明。建议在用Scala编写相关功能实现时,边学习、边应用、边摸索以加深对Scala的理解和应用。1. 变量、表达式、循环、Option、方法和函数1原创 2020-09-22 20:39:25 · 267 阅读 · 0 评论 -
Spark在处理数据的时候,会将数据都加载到内存再做处理吗?
对于Spark的初学者,往往会有一个疑问:Spark(如SparkRDD、SparkSQL)在处理数据的时候,会将数据都加载到内存再做处理吗?很显然,答案是否定的!对该问题产生疑问的根源还是对Spark计算模型理解不透彻。对于Spark RDD,它是一个分布式的弹性数据集,不真正存储数据。如果你没有在代码中调用persist或者cache算子,Spark是不会真正将数据都放到内存里的。此外,还要考虑persist/cache的缓存级别,以及对什么进行缓存(比如是对整张表生成的DataSet缓存还是列原创 2020-09-17 17:24:43 · 1320 阅读 · 0 评论 -
Spark流式状态管理(mapWithState)
mapWithState支持输出全量的状态和更新的状态,还支持对状态超时管理,用户可以根据业务需求选择需要的输出,性能优于于updateStateByKey。def main(args: Array[String]): Unit = { //单词统计 val ssc = StreamingContext.getOrCreate(mapwithstateCKDir, () => createContext(brokers, topics, groupId, batchTim原创 2020-09-16 12:51:31 · 912 阅读 · 1 评论 -
Spark流式状态管理(updateStateByKey)
通常使用Spark的流式框架如Spark Streaming,做无状态的流式计算是非常方便的,仅需处理每个批次时间间隔内的数据即可,不需要关注之前的数据,这是建立在业务需求对批次之间的数据没有联系的基础之上的。但如果我们要跨批次做一些数据统计,比如batch是3秒,但要统计每1分钟的用户行为,那么就要在整个流式链条中维护一个状态来保存近1分钟的用户行为。那么如果维护这样一个状态呢?一般情况下,主要通过以下几种方式:spark内置算子:updateStateByKey、mapWithState原创 2020-09-16 12:49:47 · 680 阅读 · 0 评论 -
Spark广播变量HttpBroadcast和TorrentBroadcast对比
HttpBroadcast会在driver端的BlockManager里面存储广播变量对象,并且将该广播变量序列化写入文件中去。所有获取广播数据请求都在driver端,所以存在单点故障和网络IO性能问题。TorrentBroadcast会在driver端的BlockManager里面存储广播变量对象,并将广播对象分割成若干序列化block块(默认4M),存储于BlockManager。小的block存储位置信息,存储于Driver端的BlockManagerMaster。数据请求并非集中于driver端,原创 2020-09-15 13:50:09 · 163 阅读 · 0 评论 -
java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream.<init>(Ljava/io/InputStream;Z)V
1. 现象在利用Spark和Kafka处理数据时,有时会同时在maven pom中引入Spark和Kafka的相关依赖。但是当利用Spark SQL处理数据生成的DataSet/DataFrame进行collect或者show等操作时,抛出以下异常信息:in stage 3.0 (TID 403, localhost, executor driver): java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream.<init&g原创 2020-08-31 16:37:06 · 2214 阅读 · 0 评论 -
通过Spark生成HFile,并以BulkLoad方式将数据导入到HBase
在实际生产环境中,将计算和存储进行分离,是我们提高集群吞吐量、确保集群规模水平可扩展的主要方法之一,并且通过集群的扩容、性能的优化,确保在数据大幅增长时,存储不能称为系统的瓶颈。具体到我们实际的项目需求中,有一个典型的场景,通常会将Hive中的部分数据,比如热数据,存入到HBase中,进行冷热分离处理。我们采用Spark读取Hive表数据存入HBase中,这里主要有两种方式:通过HBase的put API进行数据的批量写入通过生成HFile文件,然后通过BulkLoad方式将数据存入HBas原创 2020-08-27 19:57:53 · 1497 阅读 · 0 评论 -
Spark流式程序中广播变量和累加器为何使用单例模式
1.广播变量是只读的,使用单例模式可以减少Spark流式程序中每次job生成执行,频繁创建广播变量带来的开销2.广播变量单例模式也需要做同步处理。在FIFO调度模式下,基本不会发生并发问题。但是如果你改变了调度模式,如采用公平调度模式,同时设置Spark流式程序并行执行的job数大于1,如设置参数spark.streaming.concurrentJobs=4,则必须加上同步代码3.在多个输出流共享广播变量的情况下,同时配置了公平调度模式,也会产生并发问题。建议在foreachRDD或者transfor原创 2020-07-30 16:43:17 · 210 阅读 · 0 评论 -
Spark动态更新广播变量
通过之前文章的介绍,大家都知道广播变量是只读的,那么在Spark流式处理中如何进行动态更新广播变量?既然无法更新,那么只能动态生成,应用场景有实时风控中根据业务情况调整规则库、实时日志ETL服务中获取最新的日志格式以及字段变更等。/** @author : 公众号:大数据学习与分享 */@volatile private var instance: Broadcast[Array[Int]] = null//获取广播变量单例对象def getInstance(sc: SparkContext,原创 2020-07-21 17:49:56 · 874 阅读 · 0 评论 -
面试与实战 | Spark调优策略
在利用Spark处理数据时,如果数据量不大,那么Spark的默认配置基本就能满足实际的业务场景。但是当数据量大的时候,就需要做一定的参数配置调整和优化,以保证业务的安全、稳定的运行。并且在实际优化中,要考虑不同的场景,采取不同的优化策略。1.合理设置微批处理时间在SparkSreaming流式处理中,合理的设置微批处理时间(batchDuration)是非常有必要的。如果batchDuration设置过短,会导致SparkStreaming频繁提交job。如果每个batchDuration所产生的jo原创 2020-07-13 21:07:38 · 289 阅读 · 0 评论 -
Spark中广播变量详解(TorrentBroadcast)
【前言:Spark目前提供了两种有限定类型的共享变量:广播变量和累加器,今天主要介绍一下基于Spark2.4版本的广播变量。先前的版本比如Spark2.1之前的广播变量有两种实现:HttpBroadcast和TorrentBroadcast,但是鉴于HttpBroadcast有各种弊端,目前已经舍弃这种实现,本篇文章也主要阐述TorrentBroadcast】广播变量概述广播变量是一个只读变量,通过它我们可以将一些共享数据集或者大变量缓存在Spark集群中的各个机器上而不用每个task都需要copy一个原创 2020-07-12 11:38:20 · 706 阅读 · 0 评论 -
Spark存储Parquet数据到Hive,对map、array、struct字段类型的处理
利用Spark往Hive中存储parquet数据,针对一些复杂数据类型如map、array、struct的处理遇到的问题?为了更好的说明导致问题的原因、现象以及解决方案,首先看下述示例:创建存储格式为parquet的Hive非分区表:CREATE EXTERNAL TABLE `t1`(`id` STRING,`map_col` MAP<STRING, STRING>,`arr_col` ARRAY<STRING>,`struct_col` STRUCT<A:ST原创 2020-06-23 22:17:32 · 1276 阅读 · 0 评论 -
Apache Spark 3.0.0重磅发布 —— 重要特性全面解析
2020年6月18日,开发了近两年(自2018年10月份至今)的Apache SparkTM 3.0.0正式发布!Apache SparkTM 3.0.0版本包含3400多个补丁,是开源社区做出巨大贡献的结晶,在Python和SQL功能方面带来了重大进展并且将重点聚焦在了开发和生产的易用性上。同时,今年也是Spark开源10周年,这些举措反映了Spark自开源以来,是如何不断的满足更广泛的受众需求以及更多的应用场景。首先来看一下Apache SparkTM 3.0.0主要的新特性:在TPC-DS基原创 2020-06-21 22:08:04 · 773 阅读 · 0 评论 -
详细解析SparkStreaming和Kafka集成的两种方式的区别和优劣
spark streaming是基于微批处理的流式计算引擎,通常是利用spark core或者spark core与spark sql一起来处理数据。在企业实时处理架构中,通常将spark streaming和kafka集成作为整个大数据处理架构的核心环节之一。针对不同的spark、kafka版本,集成处理数据的方式分为两种:Receiver based Approach和Direct Approach,不同集成版本处理方式的支持,可参考下图:Receiver based Approach基于rec原创 2020-06-10 20:13:49 · 589 阅读 · 0 评论 -
Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
首先说一下,这里解决的问题应用场景:sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区?这里涉及到两种情况:select SQL查询和加载Hive表路径的方式。这里仅就"加载Hive表路径的方式"解析分区表字段,在处理时出现的一些问题及解决作出详细说明。如果大家有类似的需求,笔者建议通过解析Spark SQL logical plan和下面说的这种方式解决方案结合,封装成一个通用的工具。问题现象sparksql加载指定Hive分原创 2020-06-06 20:39:44 · 1219 阅读 · 0 评论 -
Spark SQL | 目前Spark社区最活跃的组件之一
Spark SQL是一个用来处理结构化数据的Spark组件,前身是shark,但是shark过多的依赖于hive如采用hive的语法解析器、查询优化器等,制约了Spark各个组件之间的相互集成,因此Spark SQL应运而生。Spark SQL在汲取了shark诸多优势如内存列存储、兼容hive等基础上,做了重新的构造,因此也摆脱了对hive的依赖,但同时兼容hive。除了采取内存列存储优化性能,还引入了字节码生成技术、CBO和RBO对查询等进行动态评估获取最优逻辑计划、物理计划执行等。基于这些优化,使得原创 2020-05-28 22:00:08 · 266 阅读 · 0 评论 -
编写的Spark程序代码,运行在driver端还是executor端呢?
在Spark中:driver是运行用户编写Application 的main()函数的地方,具体负责DAG的构建、任务的划分、task的生成与调度等。job,stage,task生成都离不开rdd自身,rdd的相关的操作不能缺少driver端的sparksession/sparkcontext。executor是真正执行task地方,而task执行离不开具体的数据,这些task运行的结果可以是shuffle中间结果,也可以持久化到外部存储系统。一般都是将结果、状态等汇集到driver。但是,目前exec原创 2020-05-25 21:22:08 · 2002 阅读 · 0 评论 -
Spark闭包函数从产生到在executor执行经历了什么?
首先,对RDD相关的操作需要传入闭包函数,如果这个函数需要访问外部定义的变量,就需要满足一定条件(比如必须可被序列化),否则会抛出运行时异常。闭包函数在最终传入到executor执行,需要经历以下步骤:1.driver通过反射,运行时找到闭包访问的变量,并封装成一个对象,然后序列化该对象2.将序列化后的对象通过网络传输到worker节点3.worker节点反序列化闭包对象4.worker节点的executor执行闭包函数简而言之,就是要通过网络传递函数、然后执行,期间会经历序列化和反序列化,所以要原创 2020-05-18 21:21:36 · 157 阅读 · 0 评论 -
Spark闭包
闭包的作用可以理解为:函数可以访问函数外部定义的变量,但是函数内部对该变量进行的修改,在函数外是不可见的,即对函数外源变量不会产生影响。其实,在学习Spark时,一个比较难理解的点就是,在集群模式下,定义的变量和方法作用域的范围和生命周期。这在你操作RDD时,比如调用一些函数map、foreach时,访问其外部变量进行操作时,很容易产生疑惑。为什么我本地程序运行良好且结果正确,放到集群上却得不到想要的结果呢?首先通过下边对RDD中的元素进行求和的示例,来看相同的代码本地模式和集群模式运行结果的区别:原创 2020-05-17 19:04:21 · 701 阅读 · 0 评论 -
Spark和MapReduce任务计算模型
【前言:本文主要从任务处理的运行模式为角度,分析Spark计算模型,希望帮助大家对Spark有一个更深入的了解。同时拿MapReduce和Spark计算模型做对比,强化对Spark和MapReduce理解】从整体上看,无论是Spark还是MapReduce都是多进程模型。如,MapReduce是由很多MapTask、ReduceTask等进程级别的实例组成的;Spark是由多个worker、ex...原创 2020-04-17 21:14:25 · 536 阅读 · 0 评论 -
重要 | Spark分区并行度决定机制
最近经常有小伙伴留言,核心问题都比较类似,就是虽然接触Spark有一段时间了,但是搞不明白一个问题,为什么我从HDFS上加载不同的文件时,打印的分区数不一样,并且好像spark.default.parallelism这个参数时不是一直起作用?其实笔者之前的文章已有相关介绍,想知道为什么,就必须了解Spark在加载不同的数据源时分区决定机制以及调用不用算子时并行度决定机制以及分区划分。其实之前的文...原创 2020-04-01 22:23:12 · 1101 阅读 · 0 评论 -
Spark集群和任务执行
【前言:承接《Spark通识》篇】Spark集群组件Spark是典型的Master/Slave架构,集群主要包括以下4个组件:Driver:Spark框架中的驱动器,运行用户编写Application 的main()函数。类比于MapReduce的MRAppmasterMaster:主节点,控制整个集群,监控worker。在Yarn模式中为全局资源管理器Worker:从节点,负责控制计...原创 2019-12-09 20:46:38 · 322 阅读 · 0 评论 -
Spark为什么只有在调用action时才会触发任务执行呢(附算子优化和使用示例)?
Spark算子主要划分为两类:transformation和action,并且只有action算子触发的时候才会真正执行任务。还记得之前的文章《Spark RDD详解》中提到,Spark RDD的缓存和checkpoint是懒加载操作,只有action触发的时候才会真正执行,其实不仅是Spark RDD,在Spark其他组件如SparkStreaming中也是如此,这是Spark的一个特性之一。像...原创 2019-12-01 11:59:51 · 1310 阅读 · 1 评论 -
通过spark.default.parallelism谈Spark并行度
本篇文章首先通过大家熟知的一个参数spark.default.parallelism为引,聊一聊Spark并行度都由哪些因素决定?上图是spark官网关于spark.default.parallelism参数说明:对于reduceByKey和join这些分布式shuffle算子操作,取决于它的父RDD中分区数的最大值对于没有父RDD的的算子,比如parallelize,依赖于集群管理器:...原创 2019-11-27 22:00:07 · 1508 阅读 · 1 评论 -
聊聊Spark的分区
通过上篇文章【Spark RDD详解】,大家应该了解到Spark会通过DAG将一个Spark job中用到的所有RDD划分为不同的stage,每个stage内部都会有很多子任务处理数据,而每个stage的任务数是决定性能优劣的关键指标。 首先来了解一下...原创 2019-11-25 21:09:54 · 244 阅读 · 0 评论 -
Spark RDD详解 —— RDD特性、lineage、缓存、checkpoint、依赖关系
RDD(Resilient Distributed Datasets)弹性的分布式数据集,又称Spark core,它代表一个只读的、不可变、可分区,里面的元素可分布式并行计算的数据集。 RDD是一个很抽象的概念,不易于理解,但是要想学好Spark,必须要掌握RDD,熟悉它的编程模型,这是学习Spark其他组件的基础。笔者在这里从名字和几个重要的概念给大家一一解读:Resili...原创 2019-11-24 11:30:09 · 482 阅读 · 0 评论 -
Spark通识
在说Spark之前,笔者在这里向对Spark感兴趣的小伙伴们建议,想要了解、学习、使用好Spark,Spark的官网是一个很好的工具,几乎能满足你大部分需求。同时,建议学习一下scala语言,主要基于两点:1. Spark是scala语言编写的,要想学好Spark必须研读分析它的源码,当然其他技术也不例外;2. 用scala语言编写Spark程序相对于用Java更方便、简洁、开发效率更高(后续我会...原创 2019-11-20 20:09:53 · 143 阅读 · 0 评论