如何用PySpark为Spark DataFrame新增列添加数组列表?
How to Add a Fixed Array Column to Spark DataFrame
你遇到的错误是因为lit()函数只能处理单个基本类型的字面量(比如整数、字符串),没办法直接把Python列表转换成Spark的ArrayType列。要实现你想要的效果,有两种简洁的解决方案:
方法1:使用array()函数构造数组
Spark SQL提供了array()函数,专门用来创建数组类型的列。你只需要把数组里的每个元素用lit()包裹,再传给array()就行:
from pyspark.sql.functions import array, lit # 假设df是你的原始DataFrame array_list = [0, 0, 0, 0] # 用array()函数构造固定数组列 df = df.withColumn("x4", array(*[lit(num) for num in array_list]))
方法2:使用array_repeat()简化代码(适合重复元素的数组)
如果你的数组是由相同元素重复组成的(比如这里的4个0),用array_repeat()会更简洁,只需要指定元素和重复次数:
from pyspark.sql.functions import array_repeat, lit df = df.withColumn("x4", array_repeat(lit(0), 4))
运行结果
两种方法都会得到你期望的DataFrame:
+---+---+-----+---------+ | x1| x2| x3| x4| +---+---+-----+---------+ | 1| a| 23.0|[0,0,0,0]| | 3| B|-23.0|[0,0,0,0]| +---+---+-----+---------+
错误原因补充
py4j.protocol.Py4JJavaError这个错误本质是因为Spark的lit()函数在Java层面只支持基本数据类型,无法识别Python的ArrayList对象。而array()和array_repeat()是Spark专门为数组类型设计的函数,能正确生成Spark的ArrayType列。
内容的提问来源于stack exchange,提问作者abhjt
相关产品推荐
相关产品推荐

