Apache spark 我应该在Spark DataFrame上应用什么转换
我有两个Spark数据帧(A和B),它们都有一个公共列/字段(这是数据帧A中的主键,但不是B中的主键) 对于数据帧A中的每个记录/行,数据帧B中有多个记录。 基于该公共列值,我希望针对数据帧A中的每条记录从数据帧B中获取所有记录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 如果您的数据没有很好地分区/扣合,将导致洗牌连接。其中,每个节点都与其他节点通信,并根据哪个节点具有某个密钥或一组密钥(您要加入的密钥)共享数据。这
我应该执行什么样的转换才能在不进行太多洗牌的情况下收集记录?要组合来自2个或多个spark数据帧的记录,必须使用join 如果您的数据没有很好地分区/扣合,将导致洗牌连接。其中,每个节点都与其他节点通信,并根据哪个节点具有某个密钥或一组密钥(您要加入的密钥)共享数据。这些连接代价高昂,因为网络可能会因流量而变得拥挤 如果出现以下情况,则可以避免混洗:
- 两个数据帧都有一个已知的分区器或Bucketized
- 其中一个数据集足够小,可以放入内存中,在这种情况下,我们可以进行广播哈希连接
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
- 其中一个数据集足够小,可以放入内存中,在这种情况下,我们可以进行广播哈希连接
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
。您可以提供示例输入数据吗?