#apache-spark #dictionary #pyspark #apache-spark-sql
#apache-spark #словарь #pyspark #apache-spark-sql
Вопрос:
Я создал код, который считывает файл parquet, запрашивает его с помощью SQL-запроса — пока я использую udf (udf получает объект list и возвращает объект dictionary), а затем сохраняет его также как parquet.
В качестве выходных данных я хочу получить тип карты в столбце, который я получаю из udf (словаря).
Но я получаю строковый тип.
UDF:
def udf_count_frequencies(elements):
if not elements:
return None
counter = Counter()
for e in elements:
e = unicode(e).encode('utf-8').strip()
counter[e] = 1
return dict(counter)
SQL:
select user_id, count_frequencies(collect_list(group))
from user_likes
group by 1
Как я могу запросить данные и получить ответ, который устанавливает столбец как карту, пока я его сохраняю, и не преобразует его в строку?
Комментарии:
1. Можете ли вы вставить свой код сюда?
2. @howie — Привет, я отредактировал свой вопрос с помощью кода
3. Вы хотите, чтобы count_frequencies(collect_list (group)) возвращались как тип карты? Можете ли вы распечатать свою схему фрейма данных?
4. @howie — Моя схема фрейма данных состоит из 2 столбцов — строка идентификатора пользователя, строка группы — я хочу вернуть карту: group —> # of appearances .
5. группировать по идентификатору пользователя или группировать по 1?
Ответ №1:
Вы пытаетесь указать свой тип карты udf?
udf_flatten_counter = udf(
lambda x: dict(Counter(x)),
MapType(StringType(), IntegerType()))