【问题标题】:Split PySpark Map-like string into Map Object将 PySpark 类似地图的字符串拆分为地图对象
【发布时间】:2021-09-01 18:04:58
【问题描述】:

我在 PySpark 中有一个列,其中包含存储为字符串的类似字典/地图的值。

示例值:

'{1:'Hello', 2:'Hi', 3:'Hola'}'
'{1:'Dogs', 2:'Dogs, Cats, and Fish', 3:'Fish & Turtles'}'
'{1:'Pizza'}'

我想将这些字符串转换为数组或映射,因此我可以在它们上使用 .explode() 函数为每个 dict 键项对创建一行。我会在每个逗号上使用.split(),但由于某些值中有逗号,所以这不起作用。

我正在使用存储在 udf 中的 ast.literal_eval() 函数,但是当我在感兴趣的列上将其作为 udf 运行时,它仍然返回一个字符串而不是 MapType 对象。对解决此问题的最佳方法有何想法?

【问题讨论】:

    标签: python apache-spark pyspark user-defined-functions


    【解决方案1】:

    如果要使用literal_eval,则需要指定返回类型为map:

    from ast import literal_eval
    import pyspark.sql.functions as F
    
    df2 = df.withColumn('col', F.udf(literal_eval, 'map<int,string>')('col'))
    
    df2.show(truncate=False)
    +-----------------------------------------------------------+
    |col                                                        |
    +-----------------------------------------------------------+
    |[1 -> Hello, 2 -> Hi, 3 -> Hola]                           |
    |[1 -> Dogs, 2 -> Dogs, Cats, and Fish, 3 -> Fish & Turtles]|
    |[1 -> Pizza]                                               |
    +-----------------------------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 2015-02-02
      • 2014-04-01
      • 2021-08-13
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      相关资源
      最近更新 更多