Кодировать и собрать несколько функций в 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
) содержащий вывод функции выше (или что-то функционально эквивалентное).