PySpark 等效于来自 Scala API 的函数“typedLit”

nee*_*ani 6 scala apache-spark apache-spark-sql pyspark

我们typedLit在用于 Spark 的 Scala API 中有一个函数可以将 Array 或 Map 添加为列值。

import org.apache.spark.sql.functions.typedLit
val df1 = Seq((1, 0), (2, 3)).toDF("a", "b")

df1.withColumn("seq", typedLit(Seq(1,2,3)))
    .show(truncate=false)

+---+---+---------+
|a  |b  |seq      |
+---+---+---------+
|1  |0  |[1, 2, 3]|
|2  |3  |[1, 2, 3]|
+---+---+---------+
Run Code Online (Sandbox Code Playgroud)

我在 PySpark 中找不到等价物。我们如何在 PySpark 中创建一个以 Array 作为列值的列?

Ani*_*non 6

pyspark 中还没有等效的函数,但您可以拥有一个数组列,如下所示:

from pyspark.sql.functions import array, lit
df = sc.parallelize([[1,2], [3,4]]).toDF(['a', 'b'])
df.withColumn('seq', array([lit(i) for i in [1,2,3]])).show()
Run Code Online (Sandbox Code Playgroud)

输出:

+---+---+---------+                                                             
|  a|  b|      seq|
+---+---+---------+
|  1|  2|[1, 2, 3]|
|  3|  4|[1, 2, 3]|
+---+---+---------+
Run Code Online (Sandbox Code Playgroud)


bne*_*ijt 0

您可以在调用.cast()后直接使用以下命令:lit()Column

import pyspark.sql.functions as sf
from pyspark.sql.types import LongType

df1.withColumn("long", sf.lit(1).cast(LongType()))
Run Code Online (Sandbox Code Playgroud)

同样适用于array():

import pyspark.sql.functions as sf
from pyspark.sql.types import LongType, ArrayType
df1.withColumn("pirate", sf.array([sf.lit(x).cast(LongType()) for x in [1, 2, 3]]))
df1.withColumn("pirate", sf.array([sf.lit(x) for x in [1, 2, 3]]).cast(ArrayType(LongType())))
Run Code Online (Sandbox Code Playgroud)

如果你真的喜欢文本和打字但讨厌类型,你可以使用:

df1.withColumn("pirate", sf.array(sf.lit("1"), sf.lit("2")).cast("array<int>"))
Run Code Online (Sandbox Code Playgroud)

;)

PS 还可以考虑使用mapwithsf.lit代替 for 理解。