spark 缓存表的使用

spark 几种缓存数据的方法

1- 缓存表

1、cache table

//缓存全表
sqlContext.sql("CACHE TABLE activity")

//缓存过滤结果
sqlContext.sql("CACHE TABLE activity_cached as select * from activity where ...")

CACHE TABLE是即时生效(eager)的,如果你想等到一个action操作再缓存数据可以使用CACHE LAZY TABLE,这样操作会直到一个action操作才被触发,例如count(*)

sqlContext.sql("CACHE LAZY TABLE ...")
// 取消缓存表
sqlContext.sql("UNCACHE TABLE activity")

2、将dataFrame注册成表并缓存

val df = sqlContext.sql("select * from activity")
df.registerTempTable("activity_cached")
sqlContext.cacheTable("activity_cached")

//Tip:cacheTable操作是lazy的,需要一个action操作来触发缓存操作。

//对应的uncacheTable可以取消缓存
sqlContext.uncacheTable("activity_cached")

3、缓存dataFrame

val df = sqlContext.sql("select * from tableName")
df.cache()

2-缓存结果查看

3-缓存参数设置

//该参数默认为10M,在进行join等聚合操作时,将小于该值的表broadcast到每台worker,消除了大量的shuffle操作。
spark.sql.autoBroadcastJoinThreshold
//将rdd存入mem或disk前再进行一次压缩,效果显著,我使用cacheTable了一张表,没有开启该参数前总共cache了54G数据,开启这个参数后只34G,可是执行速度并没有收到太大的影响。
spark.rdd.compress true
//这个参数默认为200,是join等聚合操作的并行度,
spark.sql.shuffle.partitions
//如果有大量的数据进行操作,造成单个任务比较重,运行时间过长的时候,会报如下的错误:
org.apache.spark.shuffle.FetchFailedException: Connection from /192.168.xx.xxx:53450 closed
//这个时候需要提高该值。

### Spark 缓存的适用场景及应用案例 #### 适用场景 Spark缓存适用于那些需要反复读取的数据集,尤其是当这些数据集在多个操作之间共享时。通过将中间计算结果存储在内存中,可以显著减少重复计算的时间开销[^2]。 对于迭代算法而言,如机器学习中的梯度下降法,在每次迭代过程中都需要访问相同的数据源;此时利用缓存功能能够有效提升性能。另外,在涉及宽依赖的操作链路里(比如连接不同分区的数据),合理设置缓存同样有助于优化整体作业效率[^3]。 #### 应用案例 ##### 场景一:机器学习模型训练 假设有一个大规模的日志文件用于构建推荐系统模型。在这个过程中,特征提取阶段会频繁扫描原始日志记录来生成样本向量。如果不采取任何措施,默认情况下每一次调用action都会触发完整的转换流水线重新执行一次,这无疑浪费了大量的资源。因此可以在完成初步预处理之后立即对得到的结果进行cache()或persist(StorageLevel.MEMORY_ONLY),从而使得后续多次使用的同一份数据可以直接从内存加载而不是每次都重头再来[^1]。 ```python from pyspark import SparkContext, StorageLevel sc = SparkContext() # 加载并预处理数据 raw_logs = sc.textFile("hdfs://path/to/logs") processed_data = raw_logs.map(lambda line: process_line(line)) # 将处理后的数据缓存在内存中 processed_data.persist(StorageLevel.MEMORY_ONLY) # 开始训练过程... for iteration in range(num_iterations): model.train(processed_data) ``` ##### 场景二:ETL 数据管道 在一个典型的企业级 ETL 流程中,通常会有多个下游任务依赖于同一个上游输入表。如果不对该公共前置步骤做特殊处理,则意味着每当有新的需求加入进来就要再次经历一遍冗长而耗时的过程。借助于Spark 的持久化特性就可以很好地解决这个问题——只要第一次成功获取到目标表格后就立即将其保存下来供其他环节随时调阅即可。 ```sql -- SQL风格的例子展示如何在SQL查询语句里面使用CACHE TABLE命令实现同样的目的 CREATE OR REPLACE TEMP VIEW cleaned_sales AS ( SELECT * FROM sales WHERE status='completed' ); -- 对视图进行缓存 CACHE TABLE cleaned_sales; -- 后续的各种分析都可以基于已经准备好的cleaned_sales来进行 SELECT COUNT(*) FROM cleaned_sales; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值