大数据实战二十五课 - Spark SQL05

第一章:上次课回顾

第二章:

第一章:上次课回顾

https://blog.csdn.net/zhikanjiani/article/details/100082667

第二章:

**第一步:**点击load,load是DataFrameReader(org.apache.spark.sql)
def load():sql.DataFrame

  • spark.read.load()

点进去查看方法:

  /**
   * Loads input in as a `DataFrame`, for data sources that don't require a path (e.g. external
   * key-value stores).
   *
   * @since 1.4.0
   */
  def load(): DataFrame = {
    load(Seq.empty: _*) // force invocation of `load(...varargs...)`
  }

第二步:再点击1中的load:
DataFrameReader (org.apache.spark.sql) def load(paths: String*): sql.DataFrame

path后面跟的路径是一个可变参数,意思是可以跟很多路径

  def load(paths: String*): DataFrame = {
    if (source.toLowerCase(Locale.ROOT) == DDLUtils.HIVE_PROVIDER) {
      throw new AnalysisException("Hive data source can only be used with tables, you can not " +
        "read files of Hive data source directly.")
    }

再点进source里面去看,

  • private var source: String = sparkSession.sessionState.conf.defaultDataSourceName

点击defaultDataSourceName得到的如下:

  • def defaultDataSourceName: String = getConf(DEFAULT_DATA_SOURCE_NAME)

再点进去:

  • // This is used to set the default data source
    val DEFAULT_DATA_SOURCE_NAME = buildConf(“spark.sql.sources.default”)
    .doc(“The default data source to use in input/output.”)
    .stringConf
    .createWithDefault(“parquet”)

有一个参数spark.sql.sources.default,parquet是spark sql中的默认数据源。

spark中为什么要选择parquet的数据源?

spark1.5版本中查询文本格式和parquet格式的时间对比:

错误:
Shuffle的时候提示文件找不到,map端写完后在reduce端shuffle的时候拉不到数据。

spark挂了,会重新启动executor;

parquet的优势对于我们的查询有很多的帮助。

思考生产中为什么还是没有选择Parquet,而是选择了ORC?

启动Spark-shell终端,./spark-shell --master yarn
先启动application master,再启动一堆的container,启动一个spark-shell默认是两个executor,花了一分钟的时间;那申请200个exec tutor呢。

1)无法释放:
申请资源肯定是花费大量时间的,这些资源全部拿到开始跑,比如2000个task,1998个已经跑完了,还剩2个task由于数据倾斜的原因,迟迟不释放资源。
这种场景下就是对集群资源下的一种浪费

2)小任务:
比如申请executor花了1min,然而作业跑了只有20s,

3)如果有波峰波谷的花,无法去预估,如果公司资源本来就不够多呢,会造成资源吃紧和资源浪费。

假设我们读取一个hive的作业,大小100G,分区是1000,在spark.sql.shuffle.partitions中默认分区时200,这个给写死了;如何让作业共享。

Share:共享
每一个spark-shell共享一个SparkContext,
两种可以做到:JobServer、Livy

PK哥公司自研的共享平台:

Spark SQL: A compiler from queries to RDDs.

什么是RDD?

  • Dependencies
  • Partitions
  • Compute functions

RDD Programming Model
是去构建一个DAG图的。RDD的不容易读,写完后过了一天可能就会忘了。

Spark SQL Come to Rescue

  • More efficient:更高效的
  • High-level-API:更高级的API

不仅仅是写更少的代码,执行的速度还能更快。

DataFrames Datasets and SQL share the same optimization/execution pipeline.
在这里插入图片描述

select sum(v)
from (
select
ti.id,
1 + 2 +t1.value AS v
FROM t1 JOIN t2
WHERE
	t1.id = t2.id AND
	t2.id > 50 * 1000) tmp

Expression:表达式

  • an expression represents a new value, computed based on input values
  • sum(v)

Query Plan:查询计划

在这里插入图片描述

Logical Plan:逻辑执行计划

在这里插入图片描述

Transform:

在这里插入图片描述

在这里插入图片描述

先filter还是先Join的性能好?

先filter再join的性能好
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值