如何通过重复值“另一列的大小”次来创建数组列?
Posted
技术标签:
【中文标题】如何通过重复值“另一列的大小”次来创建数组列?【英文标题】: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]
【问题讨论】:
【参考方案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]|
#+-------+--------------------+------------+
【讨论】:
以上是关于如何通过重复值“另一列的大小”次来创建数组列?的主要内容,如果未能解决你的问题,请参考以下文章
如何利用EXCEL VBA将一列数据中不重复的数据读取到数组中?
如何在Matlab中用另一个不同大小数组的对应值替换表格列的某些元素?