代码之家  ›  专栏  ›  技术社区  ›  SDG

如何在pyspark上映射这个函数

  •  0
  • SDG  · 技术社区  · 6 年前

    我可能是完全错误的,但是我现在有一个如下所示的函数,它获取了我在搜索结果中出现的第一个YouTube视频的链接,给出了一个字符串输入:

    def searchYTLink(title):
        query = urllib.parse.quote(title)
        url = "https://www.youtube.com/results?search_query=" + query
        response = urllib.request.urlopen(url)
        html = response.read()
        soup = BeautifulSoup(html, 'html.parser')
        result =  soup.findAll(attrs={'class': 'yt-uix-tile-link'})[0]
        return 'https://www.youtube.com' + result['href']
    

    现在,我想向这个函数输入一个字符串列表,并将它映射到我的所有工作节点上。为此,我编写了以下代码:

    # Make sure that you initialize the Sppark Context
    sc = SparkContext(appName="MusicClassifier")
    searchTest = ['videoa', 'videob', ...]
    sc.parallelize(searchTest).map(searchYTLink)
    

    这样做对吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   tel    6 年前

    一个小问题要解决-你需要一个行动

    在一定程度上,您的示例看起来很好。为了实际执行任何代码,您需要添加 action 到你的链条的末端 RDD 方法。最直接的行动通常是 collect ,它只收集每个分区的最终值并将其作为单个分区返回 RDD :

    sc.parallelize(searchTest).map(searchYTLink).collect()
    

    笔记

    • 你确实在使用 map 正确地。传递给它的函数应该只接受一个参数,该参数 searchYTLink 做。

    • 出于性能方面的考虑,您可能还希望了解 mapPartitions(func) . mapPartitions 完全一样 地图 但是在这种情况下 func 应该是一个每次获取整块值的函数。