使用Pyspark将Arraylist值添加到Spark Dataframe中的新列

时间:2018-01-22 10:14:39

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

我想在现有数据框中添加新列。下面是我的数据框 -

+---+---+-----+
| x1| x2|   x3|
+---+---+-----+
|  1|  a| 23.0|
|  3|  B|-23.0|
+---+---+-----+

我可以像这样添加df = df.withColumn("x4", lit(0))

+---+---+-----+---+
| x1| x2|   x3| x4|
+---+---+-----+---+
|  1|  a| 23.0|  0|
|  3|  B|-23.0|  0|
+---+---+-----+---+

但我想在我的df中添加一个数组列表。

设置此[0,0,0,0]是我要添加的数组,添加后我的df会显示如下 -

+---+---+-----+---------+
| x1| x2|   x3|       x4|
+---+---+-----+---------+
|  1|  a| 23.0|[0,0,0,0]|
|  3|  B|-23.0|[0,0,0,0]|
+---+---+-----+---------+

我试过这样 -

array_list = [0,0,0,0]
df = df.withColumn("x4", lit(array_list))

但是它给出了错误

py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.sql.functions.lit.
: java.lang.RuntimeException: Unsupported literal type class java.util.ArrayList [0, 0, 0, 0, 0, 0]

有人知道怎么做吗?

1 个答案:

答案 0 :(得分:0)

Based on your comment

  

我的数组是可变的,我必须将它添加到具有不同值的多个地方。这种方法适用于添加相同的值或添加一个或两个数组。它不适合添加大量数据

我认为这是一个XY问题。如果你想要可扩展的解决方案(1000行不是很大,说实话),那么使用另一个数据帧并加入。例如,如果想通过x1

进行连接
arrays = spark.createDataFrame([
    (1, [0.0, 0.0, 0.0]), (3, [0.0, 0.0, 0.0])
], ("x1", "x4"))


df.join(arrays, ["x1"])

根据要求添加更复杂的条件。

要立即解决问题,请参阅How to add a constant column in a Spark DataFrame? - array的所有元素都应为列

from pyspark.sql.functions import lit

array(lit(0.0), lit(0.0), lit(0.0))
#  Column<b'array(0.0, 0.0, 0.0)'>