【问题标题】:PySpark DataFrame: Custom Explode FunctionPySpark DataFrame:自定义爆炸函数
【发布时间】:2018-05-21 23:37:39
【问题描述】:

如何使用 udfs 实现自定义的爆炸功能,这样我们就可以获得关于项目的额外信息?例如,与项目一起,我想要项目的索引。

我不知道该怎么做的部分是当一个 udf 返回多个值时,我们应该将这些值放在单独的行中。

【问题讨论】:

    标签: pyspark


    【解决方案1】:

    如果你需要自定义的explode函数,那么你需要编写UDF来获取数组并返回数组。例如对于这个 DF:

    df = spark.createDataFrame([(['a', 'b', 'c'], ), (['d', 'e'],)], ['array'])
    df.show()
    +---------+
    |    array|
    +---------+
    |[a, b, c]|
    |   [d, e]|
    +---------+
    

    添加索引和爆炸结果的函数可以是这样的:

    from pyspark.sql.types import *
    value_with_index = StructType([
        StructField('index', IntegerType()),
        StructField('letter', StringType())
    ])
    add_indices = udf(lambda arr: list(zip(range(len(arr)), arr)), ArrayType(value_with_index))
    df.select(explode(add_indices('array'))).select('col.index', 'col.letter').show()
    +-----+------+
    |index|letter|
    +-----+------+
    |    0|     a|
    |    1|     b|
    |    2|     c|
    |    0|     d|
    |    1|     e|
    +-----+------+
    

    【讨论】:

    • 只是好奇,有没有办法完全不使用explode?​​span>
    • @ashim RDD flatMap 是另一个选项
    • @RakeshKumar 但您需要将 DataFrame 转换为 RDD。进行这种转换是个好主意吗?
    • 这取决于你之后要做什么。如果您打算返回 DF,请避免使用 flatMap。
    【解决方案2】:

    在 Spark v. 2.1+ 中,pyspark.sql.functions.posexplode() 将爆炸数组并提供索引:

    使用与@Mariusz 相同的示例:

    df.show()
    #+---------+
    #|    array|
    #+---------+
    #|[a, b, c]|
    #|   [d, e]|
    #+---------+
    
    df.select(f.posexplode('array')).show()
    #+---+---+
    #|pos|col|
    #+---+---+
    #|  0|  a|
    #|  1|  b|
    #|  2|  c|
    #|  0|  d|
    #|  1|  e|
    #+---+---+
    

    【讨论】:

      猜你喜欢
      • 2021-01-20
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多