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
任何帮助深表感谢。谢谢。
我只是想了解 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) 我试图理解Distribute by子句以及如何使用它来Spark-SQL优化Sort-Merge Joins。
根据我的理解,Spark Sql 优化器将根据连接键(洗牌阶段)分配(连接的)两个参与表的数据集,以将相同的键共同定位在同一分区中。如果是这样的话,那么如果我们distribute by在 sql 中使用 the ,那么我们也在做同样的事情。
那么可以用什么方法distribute by来改善连接性能呢?或者,最好distribute by在通过加载过程将数据写入磁盘时使用,以便使用该数据的后续查询将受益于它,而不必对其进行洗牌?
您能用一个真实的例子来解释一下distribute by/cluster by在 Spark-SQL 中使用调整连接吗?
如何将元素列表与元组列表结合起来(如下所示)?
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) 我正在尝试了解 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 中第一次创建临时表时缓存结果吗?或者它会等待任何收集应用于它?