【问题标题】:How to create an array column by repeating a value "size of another column" times?如何通过重复值“另一列的大小”次来创建数组列?
【发布时间】:2021-01-22 10:14:54
【问题描述】:

我想添加一个新列score,它是一个数组,其长度等于另一列values 的大小,并且包含所有值2

使用列的size 时出现错误,但如果我将其替换为硬编码数字,则工作正常。

数据

columns = ["id","values"]
data = [("sample1", [12.0,10.0]), ("sample2", [1.0,2.0,3.0,4.0])]
rdd = spark.sparkContext.parallelize(data)

源数据帧

+-------+--------------------+
|     id|              values|
+-------+--------------------+
|sample1|        [12.0, 10.0]|
|sample2|[1.0, 2.0, 3.0, 4.0]|
+-------+--------------------+

预期输出

+-------+--------------------+--------------------+
|     id|              values|               score|
+-------+--------------------+--------------------+
|sample1|        [12.0, 10.0]|          [2, 2]    |
|sample2|[1.0, 2.0, 3.0, 4.0]|        [2, 2, 2, 2]|
+-------+--------------------+--------------------+

代码

from pyspark.sql.functions import *
df.withColumn("score",array([lit(x) for x in [2]*(size(col("values")))])).show()

低于错误

: java.lang.RuntimeException: 不支持的文字类型类 java.util.ArrayList [2]

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您不能将 Python 列表与 Spark 列相乘。您可以使用array_repeat 函数。

    import pyspark.sql.functions as F
    
    df2 = df.withColumn('score', F.expr('array_repeat(2, size(values))'))
    df2.show()
    +-------+--------------------+------------+
    |     id|              values|       score|
    +-------+--------------------+------------+
    |sample1|        [12.0, 10.0]|      [2, 2]|
    |sample2|[1.0, 2.0, 3.0, 4.0]|[2, 2, 2, 2]|
    +-------+--------------------+------------+
    

    【讨论】:

      【解决方案2】:

      函数 array_repeat 仅适用于 Spark 2.4+。对于旧版本,这可以使用 UDF 完成:

      from pyspark.sql.functions import udf, size, lit
      from pyspark.sql.types import ArrayType, IntegerType
      
      
      array_repeat_udf = udf(lambda v, n: [v for _ in range(n)], ArrayType(IntegerType()))
      
      df1 = df.withColumn('score', array_repeat_udf(lit(2), size("values")))
      df1.show()
      
      #+-------+--------------------+------------+
      #|     id|              values|       score|
      #+-------+--------------------+------------+
      #|sample1|        [12.0, 10.0]|      [2, 2]|
      #|sample2|[1.0, 2.0, 3.0, 4.0]|[2, 2, 2, 2]|
      #+-------+--------------------+------------+
      

      【讨论】:

        猜你喜欢
        • 2017-09-12
        • 2021-12-11
        • 2021-07-27
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        相关资源
        最近更新 更多