spark sql:如何优化多个巨大的配置单元表连接

     2023-04-15     87

关键词:

【中文标题】spark sql:如何优化多个巨大的配置单元表连接【英文标题】:spark sql: how to optimize multiple huge hive tables join 【发布时间】:2019-01-22 20:00:53 【问题描述】:

有spark sql作业:

spark.sql(s"""SELECT *
  FROM (
  select * from default.table1
  where
  created_dt between date '2018-01-01' and '2018-01-02'
  group by 1,2) table11, -- about 100,000,000 records
  default.table2 table22,-- about 600,000,000 records
  default.table3 table33,-- about 3000,000,000 records
  default.table4 table44-- about 100,000,000 records
  WHERE table22.item_id = table11.item_id
  AND hot.item_site_id  IN (SELECT SITE_ID FROM default.table5)
  AND table22.item_id = table33.item_id
  AND table22.end_dt = table33.end_dt
  AND table22.end_dt >= date '2018-01-01' - interval '180' day
  LIMIT 10000""")
  .collect()
  //.map(t => "Id: " + t(0))
  .foreach(println)

在作业中,4个Hive表应该在item_idend_dt等字段上连接。每个表大约有 100,000,000 条记录。

如何优化join?例如如果对每张表进行分区,性能可以大大提高吗?谢谢

【问题讨论】:

【参考方案1】:

有许多优化 Spark 连接的策略。许多在此Spark Summit presentation 中进行了概述。你可以找到更多关于优化SortMergeJoin性能here的细节。

请注意,排序合并连接可以非常有效地对已排序的数据进行操作。以正确形式获取数据的一种方法是将其保存为分桶表,其中每个桶中的数据已排序 (df.write.bucketBy(n, "x").sortBy("x"))。表元存储将保留有关分桶的信息,供查询优化器稍后使用。请注意,如果您保存到路径,这将不起作用,除非您使用 Databricks Delta 之类的东西。

除此之外,你想看看我对what is an optimized way of joining large tables in Spark SQL的回答。

【讨论】:

如何在 spark sql 的配置单元上下文对象中查找已登录/已连接/当前用户?

】如何在sparksql的配置单元上下文对象中查找已登录/已连接/当前用户?【英文标题】:Howtofindlogged/connected/currentuserinhivecontextobjectofsparksql?【发布时间】:2016-05-3015:38:50【问题描述】:如何在sparksql的hive上下文对象中查找已登录/... 查看详情

如何在 Spark SQL 中使用 snappy 压缩将数据写入配置单元表

】如何在SparkSQL中使用snappy压缩将数据写入配置单元表【英文标题】:HowtowritedatatohivetablewithsnappycompressioninSparkSQL【发布时间】:2019-03-0210:31:02【问题描述】:我有一个使用Hive命令创建的orchive表createtableorc1(linestring)storedasorcfile我... 查看详情

优化配置单元中的多个连接

】优化配置单元中的多个连接【英文标题】:Optimisingmultiplejoininhive【发布时间】:2018-06-0411:12:39【问题描述】:我有4个四个Hive表:A-1.2billionrecordsand250GBB-4billionrecordsand1TBC-30billionrecordsand2TBD-2billionrecordsand100GB所有表都没有分区A... 查看详情

从 spark sql 插入配置单元表

】从sparksql插入配置单元表【英文标题】:Insertintohivetablefromsparksql【发布时间】:2016-12-1719:39:35【问题描述】:我正在从json文件中读取一些数据并将其转换为我用来将数据发送到hive的字符串。数据在Hive中正常到达,但它被分配... 查看详情

Knex SQL 将多个其他表连接到第一个表上的数组中

】KnexSQL将多个其他表连接到第一个表上的数组中【英文标题】:KnexSQLJoinMultipleOtherTablesintoArrayonFirstTable【发布时间】:2019-10-2906:22:14【问题描述】:目前我正在使用Knex来查询MSSQL数据库。我有一张这样的桌子:MealsIdVegetablesIdMeal... 查看详情

如何使用配置单元上下文有效地查询 Spark 中的配置单元表?

】如何使用配置单元上下文有效地查询Spark中的配置单元表?【英文标题】:Howtoefficientlyqueryahivetableinsparkusinghivecontext?【发布时间】:2017-08-2516:54:17【问题描述】:我有一个包含时间序列数据的1.6THive表。我正在使用Hive1.2.1和Spar... 查看详情

如何加快 Spark SQL 单元测试?

】如何加快SparkSQL单元测试?【英文标题】:HowtospeedupSparkSQLunittests?【发布时间】:2015-11-2914:57:15【问题描述】:我正在评估SparkSQL以实现一个简单的报告模块(很少对已经存储在HDFS上的Avro数据进行简单聚合)。我毫不怀疑SparkS... 查看详情

如何让 Spark SQL 导入没有“L”后缀的 Long?

】如何让SparkSQL导入没有“L”后缀的Long?【英文标题】:HowcanIgetSparkSQLtoimportaLongwithoutan"L"suffix?【发布时间】:2016-06-1719:50:45【问题描述】:我有一组通过Sqoop生成mySQL数据库的CSV。我正在尝试将它们定义为Spark中数据框... 查看详情

sql优化法则小记

SQL优化技巧1.选择最有效率的表名顺序(只在基于规则的优化器中有效):        oracle的解析器按照从右到左的顺序处理from子句中的表名,from子句中写在最后的表(基础表drivingtable)将被最先处理,在from... 查看详情

如何根据之前的记录将 SQL 表连接到自身?

】如何根据之前的记录将SQL表连接到自身?【英文标题】:HowtojoinSQLtabletoitself,basedonthepreviousrecord?【发布时间】:2019-11-2201:31:54【问题描述】:我在SQLServer2016中有以下行:ID是给病人的,LogID是记录的唯一id,是一个标识列。我... 查看详情

Spark SQL - 无法将所有记录写入配置单元表

】SparkSQL-无法将所有记录写入配置单元表【英文标题】:SparkSQL-Cannotwriteallrecordstothehivetable【发布时间】:2021-03-1223:33:00【问题描述】:我是ApacheSpark框架的新手,我正在使用ApacheSpark通过Hive将数据写入Hadoop。在下面的代码中,... 查看详情

优化 spark sql 笛卡尔连接

】优化sparksql笛卡尔连接【英文标题】:OptimizingsparksqlCartesianjoin【发布时间】:2019-12-3008:53:43【问题描述】:我必须对两个分别为3M和1M的数据集执行笛卡尔连接。这意味着3M数据集中的每一行都应该连接到1M数据集中的每一行。... 查看详情

从 spark 插入到集群配置单元表

...:55:13【问题描述】:我正在尝试对数据存储进行一些性能优化。这个想法是使用hive的分桶/集群来分桶可用设备(基于列id)。我目前的方法是将基于镶木地板文件的外部表中的数据插入表中。结果,它应用了分桶。INSERTINTOTABLEbu... 查看详情

了解如何在 Spark 中执行 Hive SQL

】了解如何在Spark中执行HiveSQL【英文标题】:UnderstandinghowHiveSQLgetsexecutedinSpark【发布时间】:2018-05-0708:57:46【问题描述】:我是spark和hive的新手。我需要了解在Spark中查询配置单元表时会发生什么。我正在使用PySpark例如:warehouse... 查看详情

如何使用 Spark 数据帧将 csv 数据加载到配置单元中?

】如何使用Spark数据帧将csv数据加载到配置单元中?【英文标题】:HowIcanloadcsvdataintohiveusingSparkdataframes?【发布时间】:2017-02-1608:02:53【问题描述】:我正在尝试将数据从csv文件加载到Hive。我正在使用Spark的JAVAAPI来执行此操作。... 查看详情

无法从 spark sql 插入配置单元分区表

】无法从sparksql插入配置单元分区表【英文标题】:Unabletoinserttohivepartitionedtablefromsparksql【发布时间】:2018-08-1919:38:05【问题描述】:我有一个hive分区表txnaggr_rt_fact它有2个列分区txninterval和间隔类型。我正在尝试使用java从sparksql... 查看详情

What Joins 用于将多个表连接到一个视图中

】WhatJoins用于将多个表连接到一个视图中【英文标题】:WhatJoinstousetojoinmultipletablestogetherintooneview【发布时间】:2013-03-0612:14:45【问题描述】:我在mysql中有一个带有多个表的数据库,我想将多个表连接到一个视图中,这样我就... 查看详情

如何将多个 sql 函数包装到 Spark 中的 UDF 中?

】如何将多个sql函数包装到Spark中的UDF中?【英文标题】:HowtowrapmultiplesqlfunctionsintoaUDFinSpark?【发布时间】:2020-10-0512:16:24【问题描述】:我正在使用Spark2.3.2。在我的Dataframe中的一列上,我依次执行了许多spark.sql.functions。如何... 查看详情