Не удается получить объект карты из PySpark с помощью SQL-запроса

#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()))