Как мне сопоставить эту функцию с pyspark - PullRequest
0 голосов
/ 21 января 2019

Возможно, я подхожу к этому совершенно неправильно, но в настоящее время у меня есть функция, показанная ниже, которая получает ссылку на первое видео на YouTube, которое I появляется в результатах поиска, при условии ввода строки:

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 голосов
/ 21 января 2019

Одна маленькая вещь, которую нужно исправить - вам нужно действие

Ваш пример выглядит хорошо, до определенного момента. Чтобы фактически выполнить любой код, вам нужно добавить action в конец вашей цепочки RDD методов. Наиболее простым действием обычно является collect, которое просто соберет окончательное значение каждого раздела и вернет его в виде единого RDD:

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

Примечания

  • Вы действительно, кажется, правильно используете map. Функция, которую вы передаете в нее, должна принимать ровно один аргумент, который searchYTLink делает.

  • По соображениям производительности вы также можете посмотреть mapPartitions(func). mapPartitions точно так же, как map, но в этом случае func должна быть функцией, которая принимает целый кусок значений за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...