Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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 DataFrame上应用什么转换_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark 我应该在Spark DataFrame上应用什么转换

Apache spark 我应该在Spark DataFrame上应用什么转换,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有两个Spark数据帧(A和B),它们都有一个公共列/字段(这是数据帧A中的主键,但不是B中的主键) 对于数据帧A中的每个记录/行,数据帧B中有多个记录。 基于该公共列值,我希望针对数据帧A中的每条记录从数据帧B中获取所有记录 我应该执行什么样的转换才能在不进行太多洗牌的情况下收集记录?要组合来自2个或多个spark数据帧的记录,必须使用join 如果您的数据没有很好地分区/扣合,将导致洗牌连接。其中,每个节点都与其他节点通信,并根据哪个节点具有某个密钥或一组密钥(您要加入的密钥)共享数据。这

我有两个Spark数据帧(A和B),它们都有一个公共列/字段(这是数据帧A中的主键,但不是B中的主键)

对于数据帧A中的每个记录/行,数据帧B中有多个记录。 基于该公共列值,我希望针对数据帧A中的每条记录从数据帧B中获取所有记录


我应该执行什么样的转换才能在不进行太多洗牌的情况下收集记录?

要组合来自2个或多个spark数据帧的记录,必须使用join

如果您的数据没有很好地分区/扣合,将导致洗牌连接。其中,每个节点都与其他节点通信,并根据哪个节点具有某个密钥或一组密钥(您要加入的密钥)共享数据。这些连接代价高昂,因为网络可能会因流量而变得拥挤

如果出现以下情况,则可以避免混洗:

  • 两个数据帧都有一个已知的分区器或Bucketized
  • 其中一个数据集足够小,可以放入内存中,在这种情况下,我们可以进行广播哈希连接
分区

如果在加入之前正确地划分数据,那么执行效率会更高,因为即使计划了洗牌,如果来自两个不同数据帧的数据已经位于同一台机器上,Spark也可以避免洗牌

df1.repartition(col("id"))
df2.repartition(col("id"))

// you can optionally specify the number of partitions like:        
df1.repartition(10, col("id"))

// Join Dataframes on id column    
df1.join(df2, "id") // this will avoid the duplicate id columns in output DF.
广播散列联接

当其中一个数据集小到足以容纳单个工作节点的内存时,我们可以优化连接

Spark将把小数据帧复制到集群中的每个工作节点上(无论它位于一台机器上还是多台机器上)。这听起来很贵。但是,这会阻止我们在整个连接过程中执行全对全通信。相反,它在开始时只执行一次,然后让每个工作节点执行工作,而不必等待或与任何其他工作节点通信

import org.apache.spark.sql.functions.broadcast
// explicitly specify the broadcast hint, though spark handles it.
df1.join(broadcast(df2), "id")

要组合来自2个或多个spark数据帧的记录,必须使用join

如果您的数据没有很好地分区/扣合,将导致洗牌连接。其中,每个节点都与其他节点通信,并根据哪个节点具有某个密钥或一组密钥(您要加入的密钥)共享数据。这些连接代价高昂,因为网络可能会因流量而变得拥挤

如果出现以下情况,则可以避免混洗:

  • 两个数据帧都有一个已知的分区器或Bucketized
  • 其中一个数据集足够小,可以放入内存中,在这种情况下,我们可以进行广播哈希连接
分区

如果在加入之前正确地划分数据,那么执行效率会更高,因为即使计划了洗牌,如果来自两个不同数据帧的数据已经位于同一台机器上,Spark也可以避免洗牌

df1.repartition(col("id"))
df2.repartition(col("id"))

// you can optionally specify the number of partitions like:        
df1.repartition(10, col("id"))

// Join Dataframes on id column    
df1.join(df2, "id") // this will avoid the duplicate id columns in output DF.
广播散列联接

当其中一个数据集小到足以容纳单个工作节点的内存时,我们可以优化连接

Spark将把小数据帧复制到集群中的每个工作节点上(无论它位于一台机器上还是多台机器上)。这听起来很贵。但是,这会阻止我们在整个连接过程中执行全对全通信。相反,它在开始时只执行一次,然后让每个工作节点执行工作,而不必等待或与任何其他工作节点通信

import org.apache.spark.sql.functions.broadcast
// explicitly specify the broadcast hint, though spark handles it.
df1.join(broadcast(df2), "id")

您可能应该进行
join
。您可以提供示例输入数据吗?您可能应该进行
join
。您可以提供示例输入数据吗?