如何将List [String]值添加到Dataframe中的单个列

时间:2019-01-03 08:36:24

标签: scala apache-spark

我有一个数据框,我有一个值列表(可能是列表字符串),我想在我的数据框中创建一个新列,并将这些列表值作为列值添加到这个新列中。我尝试过

val x = List("def", "cook", "abc")
val c_df = null
x.foldLeft(c_df)((df, column) => df.withColumn("newcolumnname" , lit(column)))

但是它抛出StackOverflow异常,我也尝试遍历字符串值列表并添加到数据框,但是结果值是数据框列表,但我想要的只是一个数据框。

请帮助!

这是示例输入和输出数据帧: enter image description here

2 个答案:

答案 0 :(得分:0)

您可以尝试以下代码。

  1. 使用索引创建第一个DataFrame。
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()
  1. 从值列表创建另一个DataFrame。
from pyspark.sql.types import * newdf = spark.createDataFrame(['x','y', 'z'], StringType()) newdf.show()
  1. 将索引列添加到从步骤2中的值列表创建的DF中。
 w = Window.orderBy("value")
df2 = newdf.withColumn("index", row_number().over(w))
df2.show()
  1. 根据索引加入DataFrame df1和df2。
  

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以有条件地向每行添加不同的列表集。