将数组传递给Python Spark Lit函数

A. *_* R. 14 python literals apache-spark pyspark pyspark-sql

假设我有一个包含数字1-10的numpy数组a.所以a是[1 2 3 4 5 6 7 8 9 10].

现在,我还有一个Python Spark数据帧,我想要添加我的numpy数组a.我认为一列文字将完成这项工作.所以我做了以下事情:

df = df.withColumn("NewColumn", F.lit(a))
Run Code Online (Sandbox Code Playgroud)

这不起作用.错误是"不支持的文字类型类java.util.ArrayList".

现在,如果我只尝试数组中的一个元素,如下所示,它可以工作.

df = df.withColumn("NewColumn", F.lit(a[0]))
Run Code Online (Sandbox Code Playgroud)

有没有办法可以做我正在尝试的事情?我一直在努力完成我想完成的任务,这是我最接近完成它的任务.我查看了所有相关的Stack Overflow问题,但我没有得到我想要的答案.任何帮助表示赞赏.谢谢.

Ram*_*jan 20

for array in array inbuilt function

您可以使用array 内置的功能,

a = [1,2,3,4,5,6,7,8,9,10]
df = spark.createDataFrame([['a b c d e f g h i j '],], ['col1'])
df = df.withColumn("NewColumn", F.array([F.lit(x) for x in a]))
df.show(truncate=False)
Run Code Online (Sandbox Code Playgroud)

你应该得到

+--------------------+-------------------------------+
|col1                |NewColumn                      |
+--------------------+-------------------------------+
|a b c d e f g h i j |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
+--------------------+-------------------------------+
root
 |-- col1: string (nullable = true)
 |-- NewColumn: array (nullable = false)
 |    |-- element: integer (containsNull = false)
Run Code Online (Sandbox Code Playgroud)

使用udf函数

#udf function
def arrayUdf():
    return a
callArrayUdf = F.udf(arrayUdf, T.ArrayType(T.IntegerType()))

#calling udf function
df = df.withColumn("NewColumn", callArrayUdf())
Run Code Online (Sandbox Code Playgroud)

输出与for循环方式相同

更新

我正在粘贴@ pault的评论,如下所示

您可以使用map以下方法隐藏循环:df.withColumn("NewColumn", F.array(map(F.lit, a)))

  • 您可以使用`map`隐藏循环:`df.withColumn("NewColumn", F.array(map(F.lit, a)))` (2认同)
  • @pault,我认为这应该是带有(星号)展开运算符的“F.array(*map(F.lit,a))”,因为F.array无法处理地图对象。 (2认同)