Apache spark Spark SQL中连接大型表的优化方法是什么
我需要使用Spark SQL或Dataframe API连接表。需要知道实现它的最佳方式是什么 情况是:Apache spark Spark SQL中连接大型表的优化方法是什么,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我需要使用Spark SQL或Dataframe API连接表。需要知道实现它的最佳方式是什么 情况是: 所有数据都以ORC格式(基本数据帧和参考文件)显示在配置单元中 我需要将从Hive读取的一个基本文件(Dataframe)与11-13个其他参考文件连接起来,以创建一个大的内存结构(400列)(大小约为1 TB) 实现这一目标的最佳方法是什么?如果有人遇到类似问题,请分享您的经验。分区源代码使用哈希分区或范围分区,或者如果您更了解连接字段,您可以编写自定义分区。分区将有助于避免在连接期间重新
实现这一目标的最佳方法是什么?如果有人遇到类似问题,请分享您的经验。分区源代码使用哈希分区或范围分区,或者如果您更了解连接字段,您可以编写自定义分区。分区将有助于避免在连接期间重新分区,因为来自同一分区的数据跨表存在于同一位置。 兽人肯定会帮助这项事业。
如果这仍然会导致溢出,请尝试使用比磁盘快的tachyon我对如何优化连接的默认建议是:
dataframe.write.partitionBy()
)重新分区数据并持久化。然后,在循环中串行地连接子分区,“附加”到相同的最终结果表SaveMode.Append
。它不是幂等的,这是一件危险的事情。我使用SaveMode.Overwrite
深入到分区表树结构的子树中。在2.0.0和1.6.2之前,您必须删除\u SUCCESS
,否则元数据文件或动态分区发现将阻塞
希望这有帮助。Spark用于加入大表。它包括对两个表上的每一行进行散列,并将具有相同散列的行洗牌到同一分区中。在这里,密钥在两侧进行排序,并应用sortMerge算法。据我所知,这是最好的办法
为了大大加快排序速度,将大型数据集编写为带有预扣和预排序选项(相同数量的分区)的配置单元表,而不是平面拼花地板数据集
表a
.重新分区(2200元,A元,B元)
写
.巴克比(2200,“A”、“B”)
.sortBy(“A”、“B”)
.mode(“覆盖”)
.格式(“拼花地板”)
.saveAsTable(“我的数据库表a”)
表B
.重新分区(2200元,A元,B元)
写
.巴克比(2200,“A”、“B”)
.sortBy(“A”、“B”)
.mode(“覆盖”)
.格式(“拼花地板”)
.saveAsTable(“我的数据库表”)
与优势相比,编写预扣/预排序表的间接成本适中
默认情况下,底层数据集仍然是parquet,但是配置单元元存储(可以是AWS上的Glue元存储)将包含关于表的结构的宝贵信息。因为所有可能的“可连接”行都是同位的,Spark不会洗牌预排序的表(节省了很多!),也不会对表分区内预排序的行进行排序
val join=tableA.join(tableB,Seq(“A”,“B”))
查看有无预扣的执行计划
这不仅可以在连接过程中节省大量时间,还可以在相对较小的集群上运行非常大的连接,而无需OOM。在Amazon,我们大部分时间都在prod中使用它(仍有一些情况下不需要它)
要了解有关预扣带/预分拣的更多信息:
df.withColumn(“par_ID”,ID%256)。重新分区(256,'par_ID”)。write.partitionBy(“par_ID”)…
然后迭代持久化。选择('par_ID.)。清除。收集
加入每个分区并再次持久化。然后是工会。