Apache spark Spark中广播的正确使用

Apache spark Spark中广播的正确使用,apache-spark,pyspark,broadcast,Apache Spark,Pyspark,Broadcast,假设我有一个RDD,比如(使用pyspark): 我想通过使用字符串距离函数来比较每个字符串和其他字符串。因此,这种情况下的最终结果将是一个5x5矩阵,其中对角线的值1,因为字符串值在对角线处与其自身的值进行比较 因此,我的想法如下: 我创建了一个函数StringDistance(string,alist),它将string作为输入,与字符串的alist进行比较 播放RDDstrings: broadcastedRDDstrings = sc.broadcast(RDDstrings.colle

假设我有一个RDD,比如(使用pyspark):

我想通过使用字符串距离函数来比较每个字符串和其他字符串。因此,这种情况下的最终结果将是一个5x5矩阵,其中对角线的值
1
,因为字符串值在对角线处与其自身的值进行比较

因此,我的想法如下:

  • 我创建了一个函数
    StringDistance(string,alist)
    ,它将
    string
    作为输入,与字符串的
    alist
    进行比较
  • 播放
    RDDstrings

    broadcastedRDDstrings = sc.broadcast(RDDstrings.collect())
    
  • 映射初始RDD:

     stringsDistances = RDDstrings.map(lambda string:StringDistance(string,broadcastedRDDstrings.value))
    
  • 因此,在这个转换中,我将来自初始RDD的每个字符串与稍后广播的相同RDD字符串进行比较

    结果是正确的。但我的问题是,这是否是实施它的最佳方式,这是否是对广播的正确使用。还是应该
    cache()
    初始RDD


    欢迎任何负面反馈

    我建议另一种方法

    def路径距离(a,b):
    返回镜头(a)-镜头(b)
    rdd=sc.parallelize([“maritza”、“alberto”、“andres”、“dakota”、“miguel”))。sortBy(λx:x)
    距离=(rdd.笛卡尔(rdd)
    .groupByKey()
    .map(λ(x,y):[y中a的路径距离(x,a]))
    收集距离
    # [[-1, 0, 0, -1, 0],
    #  [-1, 0, 0, -1, 0],
    #  [ 0, 1, 1,  0, 1],
    #  [-1, 0, 0, -1, 0],
    #  [ 0, 1, 1,  0, 1]]
    
    您可以在RDD上使用笛卡尔方法,如

    rdd.笛卡尔(rdd)

     stringsDistances = RDDstrings.map(lambda string:StringDistance(string,broadcastedRDDstrings.value))