首页 > 解决方案 > 无法使用 SQL 查询从 PySpark 获取地图对象

问题描述

我已经构建了一个读取 parquet 文件的代码,通过 SQL 查询对其进行查询——而我使用的是 udf(udf 获取一个列表对象并返回一个字典对象),然后也将其保存为 parquet。

作为输出,我想获得一个 Map 类型,在我从 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

如何查询数据,并在我保存它时返回将列设置为映射的响应 - 并且不将其转换为字符串?

标签: apache-sparkdictionarypysparkapache-spark-sql

解决方案


您是否尝试提供您的 udf 地图类型?

udf_flatten_counter = udf(
    lambda x: dict(Counter(x)),
    MapType(StringType(), IntegerType()))

推荐阅读