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 作为列值的列?
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)
您可以在调用.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 理解。
| 归档时间: |
|
| 查看次数: |
1746 次 |
| 最近记录: |