我有一个数据框,我有一个值列表(可能是列表字符串),我想在我的数据框中创建一个新列,并将这些列表值作为列值添加到这个新列中。我尝试过
val x = List("def", "cook", "abc")
val c_df = null
x.foldLeft(c_df)((df, column) => df.withColumn("newcolumnname" , lit(column)))
但是它抛出StackOverflow
异常,我也尝试遍历字符串值列表并添加到数据框,但是结果值是数据框列表,但我想要的只是一个数据框。
请帮助!
答案 0 :(得分:0)
您可以尝试以下代码。
from pyspark.sql.functions import * from pyspark.sql import Window w = Window.orderBy("Col2") df = spark.createDataFrame([("a", 10), ("b", 20), ("c", 30)], ["Col1", "Col2"]) df1 = df.withColumn("index", row_number().over(w)) df1.show()
from pyspark.sql.types import * newdf = spark.createDataFrame(['x','y', 'z'], StringType()) newdf.show()
w = Window.orderBy("value") df2 = newdf.withColumn("index", row_number().over(w)) df2.show()
df1.join(df2, "index").show()
答案 1 :(得分:0)
Spark 1.4或更高版本中有一个函数array
,该函数采用Column
的数组并返回一个新的Column
。函数lit
采用Scala值并返回Column
类型。
import spark.implicits._
val df = Seq(1, 2, 3).toDF("col1")
df.withColumn("new_col", array(lit("def"), lit("cook"), lit("abc"))).show
+----+----------------+
|col1| new_col|
+----+----------------+
| 1|[def, cook, abc]|
| 2|[def, cook, abc]|
| 3|[def, cook, abc]|
+----+----------------+
在Spark 2.2.0中,有一个函数typedLit
,它接受Scala类型并返回一个Column
类型。此函数可以处理参数化的Scala类型,例如:List,Seq和Map。
val newDF = df.withColumn("new_col", typedLit(List("def", "cook", "abc")))
newDF.show()
newDF.printSchema()
+----+----------------+
|col1| new_col|
+----+----------------+
| 1|[def, cook, abc]|
| 2|[def, cook, abc]|
| 3|[def, cook, abc]|
+----+----------------+
root
|-- col1: integer (nullable = false)
|-- new_col: array (nullable = false)
| |-- element: string (containsNull = true)
这是您想做什么?您可以添加when
以有条件地向每行添加不同的列表集。