У меня есть класс Python, который я использую для загрузки и обработки некоторых данных в Spark. Среди различных вещей, которые мне нужно сделать, я создаю список фиктивных переменных, полученных из разных столбцов в фреймворке Spark. Моя проблема заключается в том, что я не уверен, как правильно определить пользовательскую функцию, чтобы выполнить то, что мне нужно.
В настоящее время у меня есть метод, который при сопоставлении с базовым фреймворком данных 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 (или каким-либо другим способом, я полагаю), или (б) взять RDD, полученную в результате описанной выше карты, и добавить ее в качестве нового столбца в dataframe user_data?
В любом случае, мне нужно создать новый фреймворк данных, содержащий столбцы из user_data, а также новый столбец (пусть его называют feature_array
), содержащий вывод функции выше (или что-то функционально эквивалентное).