【问题标题】:Apache pyspark How to create a column with array containing n elementsApache pyspark 如何使用包含 n 个元素的数组创建列
【发布时间】:2018-09-15 20:46:07
【问题描述】:

我有一个包含 1 列整数类型的数据框。

我想创建一个包含 n 个元素的数组的新列(n 是第一列的 #)

例如:

x = spark.createDataFrame([(1,), (2,),],StructType([ StructField("myInt", IntegerType(), True)])) 

+-----+
|myInt|
+-----+
|    1|
|    2|
|    3|
+-----+

我需要生成的数据框如下所示:

+-----+---------+
|myInt|    myArr|
+-----+---------+
|    1|      [1]|
|    2|   [2, 2]|
|    3|[3, 3, 3]|
+-----+---------+

注意,数组中的值实际上并不重要,重要的是计数。

如果生成的数据框看起来像这样就好了:

+-----+------------------+
|myInt|             myArr|
+-----+------------------+
|    1|            [item]|
|    2|      [item, item]|
|    3|[item, item, item]|
+-----+------------------+

【问题讨论】:

    标签: arrays apache-spark dataframe pyspark spark-dataframe


    【解决方案1】:

    如果可能,最好避免使用 UDF,因为它们的效率较低。您可以改用array_repeat

    import pyspark.sql.functions as F
    
    x.withColumn('myArr', F.array_repeat(F.col('myInt'), F.col('myInt'))).show()
    
    +-----+---------+
    |myInt|    myArr|
    +-----+---------+
    |    1|      [1]|
    |    2|   [2, 2]|
    |    3|[3, 3, 3]|
    +-----+---------+
    

    【讨论】:

    • 请注意,我在 spark 2.4.4 中遇到了一些问题,但在 spark 3.0.1 中可以正常工作
    【解决方案2】:

    使用udf:

    from pyspark.sql.functions import *
    
    @udf("array<int>")
    def rep_(x):
        return [x for _ in range(x)]
    
    x.withColumn("myArr", rep_("myInt")).show()
    # +-----+------+
    # |myInt| myArr|
    # +-----+------+
    # |    1|   [1]|
    # |    2|[2, 2]|
    # +-----+------+
    

    【讨论】:

      猜你喜欢
      • 2022-09-27
      • 1970-01-01
      • 2023-04-10
      • 2018-10-16
      • 2022-01-09
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多