Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark数据集连接性能_Apache Spark_Hadoop_Apache Spark Sql_Apache Spark Dataset - Fatal编程技术网

Apache spark Spark数据集连接性能

Apache spark Spark数据集连接性能,apache-spark,hadoop,apache-spark-sql,apache-spark-dataset,Apache Spark,Hadoop,Apache Spark Sql,Apache Spark Dataset,我收到一个数据集,需要将它与另一个表连接起来。因此,我想到的最简单的解决方案是为另一个表创建第二个数据集,并执行joinWith def joinFunction(狗:数据集[Dog]):数据集[(狗,猫)]={ val cats:Dataset[Cat]=spark.table(“dev_db.Cat”).as[Cat] 狗。与(猫,…) } 这里我主要关心的是spark.table(“dev_db.cat”),因为感觉我们将所有的cat数据都称为 从dev_db.cat中选择* 然后在稍

我收到一个数据集,需要将它与另一个表连接起来。因此,我想到的最简单的解决方案是为另一个表创建第二个数据集,并执行
joinWith

def joinFunction(狗:数据集[Dog]):数据集[(狗,猫)]={
val cats:Dataset[Cat]=spark.table(“dev_db.Cat”).as[Cat]
狗。与(猫,…)
}
这里我主要关心的是spark.table(“dev_db.cat”),因为感觉我们将所有的
cat
数据都称为

从dev_db.cat中选择*

然后在稍后的阶段执行
连接。或者查询优化器会直接执行连接而不引用整个表吗?有更好的解决方案吗?

您需要做一个解释,看看是否使用了谓词下推。然后你可以判断你的担忧是否正确


然而,通常现在,如果没有使用复杂的数据类型和/或数据类型不匹配不明显,则会发生下推。您也可以通过简单的createOrReplaceTempView看到这一点。请参见以下针对您的案例的建议:

a.如果您有
where
filter
limit
take
等操作,请在加入两个数据集之前尝试应用它们。Spark无法按下此类过滤器,因此您必须自己尽可能减少目标记录的数量。Spark optimizer上的优秀信息源

b.通过使用
重新分区
功能,尝试将数据集放在同一位置,并最小化乱序数据。重新分区应基于参与
join
的键,即:

dogs.repartition(1024, "key_col1", "key_col2")
dogs.join(cats, Seq("key_col1", "key_col2"), "inner")
c.如果您确定较小的数据集可以放入内存(或增加
spark.broadcast.blockSize
的值),请尝试对其使用
broadcast
。这对Spark程序的性能有一定的提升,因为它将确保同一节点中两个数据集共存


如果无法应用上述任何一项,Spark将无法知道应排除哪些记录,因此将扫描两个数据集中的所有可用行。

通过包括join的相关键进行重新分区,在大多数情况下,可以保证键的同一位置。我想,在重新分区/连接操作,因此我认为只指向代码的一部分并不容易。尽管重新分区是一个众所周知的操作,它确实做到了这一点,例如,
df。重新分区(8,Seq(“c1”,“c2”))
将把散列(c1,c2)的组合重新分配到8个分区中。然后,对于连接,Spark将尝试共同定位第二个数据帧的键(c1、c2)。这就是为什么会发生混洗,因为Spark试图将所有数据放在正确的位置。忘记我提到过它。我在考虑初始负载。我放弃评论,因为重新组装和加入当然如此。然而,问题的主旨不同。