我是新的Spark,并试图了解如何处理扭曲的数据在Spark。我创建了两个表employee和department。该员工扭曲了某个部门的数据。
其中一个解决方案是广播department表,这样可以很好地工作。但我想了解如何在下面的代码中使用盐渍技术来提高性能。
from pyspark.sql import SparkSession
import pyspark.sql.functions as f
spark = SparkSession.builder.appName("skewTestSpark").config("spark.sql.warehouse.dir",
'/user/hive/warehouse').enableHiveSupport().getOrCreate()
df1 = spark.sql("select * from spark.employee")
df2 = spark.sql("select id as dept_id, name as dept_name from spark.department")
res = df1.join(df2, df1.department==df2.dept_id)
res.write.parquet("hdfs://<host>:<port>/user/result/employee")
上述代码的分布:
1条答案
按热度按时间9lowa7mx1#
员工——即使有歪斜——也不太可能造成Spark瓶颈。事实上,这个例子是有缺陷的。想想大型连接,而不是适合广播连接类别的东西。
salting:在sql连接或分组等操作上使用“salting”时,密钥被更改为以均匀的方式重新分配数据,以便任何给定分区的任何操作的处理时间都是相似的。
连接的一个很好的例子是:https://dzone.com/articles/why-your-spark-apps-are-slow-or-failing-part-ii-da
我推荐的另一本好书是:https://godatadriven.com/blog/b-efficient-large-spark-optimisation/
我可以解释这一切,但第一个环节解释得很好。为了获得更好的密钥分配,需要进行一些实验。