小编mar*_*e20的帖子

SparkSQL 中表连接的顺序以获得更好的性能

Spark-SQL我是读表格的新手Hive。我想知道Spark是如何执行多表的 Join。我在某处读到建议始终将最大的表保留在Join顺序的顶部等等,这样有利于Join效率。我读到,在 Join 中,Spark 按顺序将第一个表(最大的)加载到内存中,并流式传输另一个表,这有助于提高 Join 性能。但是,我对这种策略如何提高性能感到困惑,因为最大的表(在大多数情况下)无法容纳在内存中并溢出到磁盘上。

任何人都可以澄清并解释 Spark 在连接 [ largevs medium]、[ largevs small] 和 [ largevs large] 表时在连接类型 ( inner& outer) 和连接性能方面所采用的连接机制。我想知道在连接表排序方面应遵循的最佳实践,以实现 Spark 使用的所有连接策略(SMJ、ShuffleHash 和 Broadcast)的最佳性能。让我们假设以下查询:

select 
a.id, 
b.cust_nm, 
c.prod_nm
from large_tab a
join medium_tab b
on a.id = b.id
join small_tab c
on a.pid = c.pid;
Run Code Online (Sandbox Code Playgroud)

注意:我们使用Spark 2.4

任何帮助深表感谢。谢谢。

sql hive sql-optimization apache-spark-sql

6
推荐指数
1
解决办法
4584
查看次数

SparkSQL 查询计划中的 HashAggregate

我只是想了解 SparkSQL (2.4) 中生成的查询计划。我有以下查询及其相应的查询计划(如下)。(该查询只是一个测试查询)。

create temporary view tab_in as
select distinct 
       mth_id 
from tgt_tbl;

select /*+ BROADCAST(c) */
a.mth_id,
a.qtr_id,
a.prod_id,
a.sale_date
from my_table a
left anti join tab_in c
on a.mth_id = c.mth_id;
Run Code Online (Sandbox Code Playgroud)

解释一下计划:

+- *(3) Project [mth_id#652, qtr_id#653, prod_id#655, sale_dt#656]
   +- *(3) BroadcastHashJoin [mth_id#652], [mth_id#867], LeftAnti, BuildRight
      :- *(3) Project [mth_id#652, qtr_id#653, sale_dt#656, prod_id#655]
      :  +- *(3) Filescan parquet test_db.my_table[mth_id#652, qtr_id#653, prod_id#655, sale_dt#656] Batched: true, Format: Parquet, Location: CatalogFileIndex[s3://test-data/my_table/0], PartitionCount: 1, PartitionFilters: [], PushedFilters: [], ReadSchema ......
      +- …
Run Code Online (Sandbox Code Playgroud)

sql-execution-plan apache-spark-sql

4
推荐指数
1
解决办法
6565
查看次数

Spark-SQL中DISTRIBUTE BY和Shuffle的区别

我试图理解Distribute by子句以及如何使用它来Spark-SQL优化Sort-Merge Joins

根据我的理解,Spark Sql 优化器将根据连接键(洗牌阶段)分配(连接的)两个参与表的数据集,以将相同的键共同定位在同一分区中。如果是这样的话,那么如果我们distribute by在 sql 中使用 the ,那么我们也在做同样的事情。

那么可以用什么方法distribute by来改善连接性能呢?或者,最好distribute by在通过加载过程将数据写入磁盘时使用,以便使用该数据的后续查询将受益于它,而不必对其进行洗牌?

您能用一个真实的例子来解释一下distribute by/cluster by在 Spark-SQL 中使用调整连接吗?

python apache-spark apache-spark-sql

3
推荐指数
1
解决办法
4314
查看次数

将元素列表组合到元组列表

如何将元素列表与元组列表结合起来(如下所示)?

a = ['x', 'y', 1234]
b = [('Broad Street', 'NY'), ('Park Street', 'CA')]
Run Code Online (Sandbox Code Playgroud)

预期输出:

[('x', 'y', 1234, 'Broad Street', 'NY'), ('x', 'y', 1234, 'Park Street',  'CA')]
Run Code Online (Sandbox Code Playgroud)

python

3
推荐指数
1
解决办法
59
查看次数

Spark SQL中缓存机制的区别

我正在尝试了解 Spark SQL 中的各种缓存机制。下面的代码片段有什么区别吗:

方法一:

cache table test_cache AS
select a, b, c
from x
inner join y
on x.a = y.a;
Run Code Online (Sandbox Code Playgroud)

方法二:

create temporary view test_cache AS
select a, b, c
from x
inner join y
on x.a = y.a;

cache table test_cache;
Run Code Online (Sandbox Code Playgroud)

由于 Spark 中的计算是惰性的,Spark 会在方法 2 中第一次创建临时表时缓存结果吗?或者它会等待任何收集应用于它?

apache-spark apache-spark-sql pyspark

2
推荐指数
1
解决办法
1206
查看次数