【问题标题】:Return list of Dictionary from UDF pyspark从 UDF pyspark 返回字典列表
【发布时间】:2021-06-17 06:40:04
【问题描述】:

我有一个字典列表,如下所示:

department_amount_pairs = [{"department_1": 100},{"department_2": 200},{"department_1": 300}]

我现在正在做的是

def department_udf(department_amount_pairs ):
    pair = []
    for d in department_amount_pairs:
         pair.append(json.dumps(d))
    return pair

这是我的 udf 定义

extractor = udf(department_udf,ArrayType(StringType()))
spark.udf.register("extractor_udf", extractor)

这就是我调用这个函数的方式

data = data.withColumn('pairs',extractor_udf('department_amount'))

它返回 JSON 对象.. "[{"department_1": 100},{"department_2": 200},{"department_1": 300}]" 我必须做 json.loads() 来提取这个数组。但我希望我的 udf 返回一个 Dictionaries

Array

我尝试不使用 json.dumps 并将字典附加到列表中。但是我得到了 NONE 值..我还尝试将返回类型更改为 ArrayType(ArrayType()) 它也不起作用...

【问题讨论】:

    标签: python arrays apache-spark dictionary pyspark


    【解决方案1】:

    您可以通过将 UDF 类型指定为 array<map<string,int>> 来返回字典数组。

    例如,

    from pyspark.sql.functions import udf
    
    def department_udf():
        return [{"department_1": 100},{"department_2": 200},{"department_1": 300}]
    
    extractor = udf(department_udf, 'array<map<string,int>>')
    
    df = spark.range(1)
    
    df.withColumn('pairs', extractor()).show(truncate=False)
    +---+---------------------------------------------------------------------+
    |id |pairs                                                                |
    +---+---------------------------------------------------------------------+
    |0  |[[department_1 -> 100], [department_2 -> 200], [department_1 -> 300]]|
    +---+---------------------------------------------------------------------+
    

    【讨论】:

    • 我试过这样做.. 但是当我把它转储到镶木地板时.. 而不是字典我得到元组
    • Spark/Parquet 中没有 dictionary 类型。您可能指的是结构,但如果数组具有不同的字段(例如,department_1、department_2),则不能在数组中使用结构。为此,您需要使用地图...
    • 让我们说如果我只有一本字典{"department_1": 100, "department_2": 200,"department_3": 300},我只希望这本字典在 1 行中。所以在 UDF 中我所做的是返回类型 = map。然后我把它扔进镶木地板。当我读到它时,它变成了元组- [("department_1": 100), ("department_2", 200), ("department_3", 300)] 我怎样才能得到地图(字典)返回?
    • 嗯...我认为镶木地板支持地图类型。我可以写一个map类型到parquet并成功读回。你能展示你用来读写的代码吗?
    • 我在之前的评论中错过的一件事是.. 我正在使用 pd.read_parquet('filename.parquet') 阅读镶木地板。如果我在 spark 中阅读,是的,我可以看到地图类型。但我希望它可以在 Pandas 中阅读
    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多