### 本地使用Scala操作Spark的关键知识点 #### 一、SparkSession的配置与初始化 在Scala中使用Spark进行数据处理时,首先需要创建一个`SparkSession`实例。这一步至关重要,因为所有的Spark应用都是基于`SparkSession`进行构建的。下面我们将详细介绍如何在本地环境中配置并初始化`SparkSession`。 ##### 配置参数详解 1. **`.master("local[*]")`**:此配置用于指定执行环境。`"local[*]"`表示在本地模式下运行,并尽可能多地使用本地线程(最多与逻辑处理器数量相同)。这对于开发和测试非常有用。 2. **`.appName("local_client_hive")`**:设置应用名称,这将在日志和UI界面中显示。 3. **`.enableHiveSupport()`**:启用Hive支持,允许在Spark应用中读写Hive表。 4. **`.config("hive.metastore.uris", "thrift://master02:9083")`**:设置Hive Metastore的服务地址,这是Hive用来存储元数据的地方。 5. **`.config("hive.metastore.warehouse.dir", "/user/hive/warehouse")`**:指定Hive仓库目录的位置,即Hive表数据的实际存储位置。 6. **`.config("hive.exec.scratchdir", "hdfs://master01:8020/hive/tmp")`**:设置临时目录,Spark和Hive在执行过程中可能需要临时存储一些数据或文件。 7. **`.config("spark.debug.maxToStringFields", "1000")`**:设置调试时的最大字段数量,这有助于在打印复杂对象时提供更完整的信息。 8. **`.config("spark.sql.sources.partitionOverwriteMode", "dynamic")`**:设置分区覆盖模式为动态,这意味着当写入数据时,如果存在相同的分区,则只覆盖这些分区的数据而不是整个表的数据。 9. **`.config("hive.exec.dynamic.partition", "true")`**:开启动态分区功能,允许在插入数据时动态地创建新的分区。 10. **`.config("hive.exec.dynamic.partition.mode", "nonstrict")`**:设置动态分区模式为非严格模式,这意味着可以创建所有分区都为动态的新分区。 完成上述配置后,调用`getOrCreate()`方法获取或创建`SparkSession`实例。 ```scala val spark = SparkSession.builder() .master("local[*]") .appName("local_client_hive") .enableHiveSupport() .config("hive.metastore.uris", "thrift://master02:9083") .config("hive.metastore.warehouse.dir", "/user/hive/warehouse") .config("hive.exec.scratchdir", "hdfs://master01:8020/hive/tmp") .config("spark.debug.maxToStringFields", "1000") .config("spark.sql.sources.partitionOverwriteMode", "dynamic") .config("hive.exec.dynamic.partition", "true") .config("hive.exec.dynamic.partition.mode", "nonstrict") .getOrCreate() ``` #### 二、通过DataFrame向Hive表中插入数据 在Scala中使用Spark向Hive表中插入数据时,通常有两种主要的方法:`saveAsTable`和`insertInto`。`saveAsTable`会覆盖整个表中的数据,而`insertInto`则提供了更细粒度的控制,可以根据分区字段覆盖特定的分区数据。 1. **确保DataFrame中包含分区字段**:为了能够正确地使用`insertInto`方法来覆盖特定分区的数据,需要确保DataFrame中包含了Hive表定义中的所有分区字段。如果没有这样做,可能会导致覆盖整个表的所有分区数据。 2. **使用`insertInto`方法**:使用`mode(SaveMode.Overwrite)`参数来指定覆盖模式,然后调用`insertInto`方法将DataFrame中的数据插入到指定的Hive表中。 ```scala // 假设df是一个DataFrame对象 df.write.mode(SaveMode.Overwrite).insertInto("your_hive_table_name") ``` 这里的`SaveMode.Overwrite`指定了覆盖模式,意味着如果存在相同的分区数据,则会被覆盖。`insertInto("your_hive_table_name")`则指定了要插入的目标Hive表。 通过这种方式,我们可以有效地控制数据的插入行为,避免不必要的数据覆盖,从而提高数据处理的效率和准确性。
- 粉丝: 724
- 资源: 76
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 有源电力滤波器(APF)模型 Matlab simulink 质量过硬 可用于治理不控整流和不平衡负载带来的电能质量问题:仿
- 西门子s7 200smart与3台三菱e740变频器通讯程序目的:西门子s7 200smart 控制3台三菱变频器通讯,通讯稳定
- 三相逆变器双闭环控制MATLAB Simulink模型,外环采用PR控制,内环采用比例控制 包含仿真模型,参考文献及设计报告
- 111Lego.zip
- Microsoft Visual C++ 14.0 or greater is required
- 产品经理项目实战案例 3:某互联网教育平台新功能开发项目.docx
- kxtj2-1009 重力传感器mtk平台驱动代码
- 基于mpc模型预测轨迹跟踪控制,总共包含两套仿真,一套是不加入四轮侧偏角软约束,一套是加入四轮侧偏角的软约束控制,通过carsi
- 基于STM32的智能环境监测系统的设计方案,该系统能够监测环境中的多种参数,如温度、湿度、光照强度等
- 巡线电力安全帽数据集,voc(xml)格式,标签为No-helmet Wear-helmet