Кодировать и собрать несколько функций в PySpark

У меня есть класс Python, который я использую для загрузки и обработки некоторых данных в Spark. Среди различных вещей, которые мне нужно сделать, я создаю список фиктивных переменных, полученных из различных столбцов в кадре данных Spark. Моя проблема в том, что я не уверен, как правильно определить пользовательскую функцию, чтобы выполнить то, что мне нужно.

I делать в настоящее время есть метод, который при отображении на базовый RDD данных решает половину проблемы (помните, что этот метод в большейdata_processor учебный класс):

def build_feature_arr(self,table):
    # this dict has keys for all the columns for which I need dummy coding
    categories = {'gender':['1','2'], ..}

    # there are actually two differnt dataframes that I need to do this for, this just specifies which I'm looking at, and grabs the relevant features from a config file
    if table == 'users':
        iter_over = self.config.dyadic_features_to_include
    elif table == 'activty':
        iter_over = self.config.user_features_to_include

    def _build_feature_,arr(row):
        result = []
        row = row.asDict()
        for col in iter_over:
            column_value = str(row[col]).lower()
            cats = categories[col]
            result += [1 if column_value and cat==column_value else 0 for cat in cats]
        return result
    return _build_feature_arr

По сути, для указанного фрейма данных он принимает значения категориальных переменных для указанных столбцов и возвращает список значений этих новых фиктивных переменных. Это означает следующий код:

data = data_processor(init_args)
result = data.user_data.rdd.map(self.build_feature_arr('users'))

возвращает что-то вроде:

In [39]: result.take(10)
Out[39]:
[[1, 0, 0, 0, 1, 0],
 [1, 0, 0, 1, 0, 0],
 [1, 0, 0, 0, 0, 0],
 [1, 0, 1, 0, 0, 0],
 [1, 0, 0, 1, 0, 0],
 [1, 0, 0, 1, 0, 0],
 [0, 1, 1, 0, 0, 0],
 [1, 0, 1, 1, 0, 0],
 [1, 0, 0, 1, 0, 0],
 [1, 0, 0, 0, 0, 1]]

Это именно то, что я хочу с точки зрения генерации списка фиктивных переменных, которые я хочу, но вот мой вопрос: как я могу (а) создать UDF с аналогичной функциональностью, которую я могу использовать в запросе Spark SQL (или каким-либо другим способом , Я полагаю), или (b) взять RDD, полученный из карты, описанной выше, и добавить ее в качестве нового столбца в фрейм данных user_data?

В любом случае, мне нужно сгенерировать новый фрейм данных, содержащий столбцы из user_data вместе с новым столбцом (давайте назовем егоfeature_array) содержащий вывод функции выше (или что-то функционально эквивалентное).

Ответы на вопрос(1)

Ваш ответ на вопрос