如何在pyspark上映射此功能

时间:2019-01-21 19:26:59

标签: python apache-spark pyspark

我可能正在解决完全错误的问题,但是我现在有一个如下所示的函数,该函数可以在给定字符串输入的情况下获取出现在搜索结果中的第一个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 个答案:

答案 0 :(得分:1)

一件小事要解决-您需要采取行动

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

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

注释

  • 您确实确实正确地使用了map。传递给它的函数应该仅使用一个参数,searchYTLink就是这样。

  • 出于性能原因,您可能还需要研究mapPartitions(func)mapPartitionsmap十分相似,但是在这种情况下,func应该是一次可接收全部值的函数。