sparkSQL学习记录之一

Spark SQL是一个为了结构化数据处理的模块,并且提供了一个叫做DataFrames的编程抽象,它也能够作为分布式SQL查询引擎。

DataFrames是一个分布式的由指定的列组成的数据集合,它相当于关系数据库中的表,或者R/Python中的数据框架,但是能够进行更多的优化。Data能够被各种wide array源所构造,如,结构化的数据文件,hive中表,外部数据库,或者存在的RDDs。

DataFrame API可以支持JAVA,SCALA,Pthon,下面的程序都是以scala来编写。

我们可以通过spark-shell来进行下面的例子的运行。

所有函数的入口点便是SQLContext 个类,或者它的某个子类。但是要创建一个基本的SQLContext,我们需要一个SparkContext。

使用shell,sc会已经被创建,此时我们需要使用该语句来创建一个sqlContext。

valsqlContext=neworg.apache.spark.sql.SQLContext(sc)

下面我们根据官方的例子来演示下DataFrame的操作。

val sc: SparkContext // An existing SparkContext.
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// Create the DataFrame
val df = sqlContext.jsonFile("examples/src/main/resources/people.json")
// Show the content of the DataFrame
df.show()
// Print the schema in a tree format
df.printSchema()
// Select only the "name" column
df.select("name").show()
// Select everybody, but increment the age by 1
df.select("name", df("age") + 1).show()
// Select people older than 21
df.filter(df("name") > 21).show()
// Count people by age
df.groupBy("age").count().show()

### HiveSQLSparkSQL 性能优化技巧最佳实践 #### HiveSQL 的性能优化 对于HiveSQL而言,其性能优化可以从多个方面入手: - **分区表设计**:合理利用分区可以显著减少扫描的数据量。当查询条件能够匹配上某个特定的分区时,Hive会自动跳过不相关的分区,从而提高效率[^2]。 - **桶表的应用**:通过设置合理的bucket数目来分布数据,可以使某些类型的join操作更加高效。这有助于平衡各reduce任务的工作负载并加快处理速度。 - **压缩技术的选择**:采用合适的压缩算法(如Snappy、Gzip等),不仅可以节省磁盘空间,还能加速I/O密集型作业中的读写过程。需要注意的是,在选择压缩方式时要权衡CPU消耗与传输带宽之间的关系[^1]。 - **调整MapReduce参数**:适当调节mapred.job.reduce.tasks的数量以及mapred.max.split.size大小,可改善整体执行计划;另外开启推测执行机制也有助于应对慢节点问题。 #### SparkSQL 的性能优化 针对SparkSQL,则应关注以下几个要点来进行调优: - **缓存中间结果集**:对于频繁访问的数据源或是迭代式的机器学习算法来说,持久化RDD/Dataset至内存中是非常有效的手段之一。这样做的好处是可以避免重复计算开销,进而提升响应时间。 - **广播变量应用**:当存在较小规模却会被多次使用的集合时,将其注册成broadcast variable可以让每个executor仅需获取一次副本即可共享给所有task使用,减少了网络通信的成本。 - **列式存储格式选用**:Parquet/ORC这类基于columnar storage model构建起来的文件格式非常适合OLAP场景下的大规模数据分析需求。因为它们允许只加载所需字段对应的block部分而非整行记录,大大降低了IO负担。 - **动态分区裁剪功能启用**:这项特性使得在多级关联查询过程中可以根据实际过滤条件提前排除掉不必要的partition分支,进一步缩小参与运算的数据范围。 ```sql -- 启用动态分区裁剪 SET hive.optimize.ppd=true; ``` - **自适应查询执行框架(AQE)**:这是Spark 3.x版本引入的一项重要改进措施,它能够在运行期间根据实际情况动态调整shuffle partition数目的多少,并且支持skew join优化等功能,极大地增强了系统的灵活性和鲁棒性。 ```scala // 开启AQE选项 spark.conf.set("spark.sql.adaptive.enabled", "true") ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值