将StringType列添加到现有Spark DataFrame,然后应用默认值

时间:2016-10-10 16:33:07

标签: scala apache-spark dataframe apache-spark-sql

Scala 2.10使用Spark 1.6.2。我有一个与<{3}}相似的类似(但不一样)的问题,但是,接受的答案不是this one,并且假设有一定数量的关于Spark的“前期知识” ;因此我无法重现或理解它。 更重要的是,该问题也仅限于向现有数据框添加新列,而我需要为所有现有行添加列以及值数据框。

所以我想在现有的Spark DataFrame中添加一个列,然后将该新列的初始值('default')应用于所有行。

val json : String = """{ "x": true, "y": "not true" }"""
val rdd = sparkContext.parallelize(Seq(json))
val jsonDF = sqlContext.read.json(rdd)

jsonDF.show()

当我运行时,我将以下内容作为输出(通过.show()):

+----+--------+
|   x|       y|
+----+--------+
|true|not true|
+----+--------+

现在我想在jsonDF创建后添加一个新字段,而不修改json字符串,这样生成的DF将如下所示:

+----+--------+----+
|   x|       y|   z|
+----+--------+----+
|true|not true| red|
+----+--------+----+

意思是,我想在DF中添加一个新的“z”列,类型为StringType,然后默认所有行包含z - 值{{1 }}

从另一个问题我将以下伪代码拼凑在一起:

"red"

但是当我运行它时,我在val json : String = """{ "x": true, "y": "not true" }""" val rdd = sparkContext.parallelize(Seq(json)) val jsonDF = sqlContext.read.json(rdd) //jsonDF.show() val newDF = jsonDF.withColumn("z", jsonDF("col") + 1) newDF.show() 方法上遇到编译器错误:

.withColumn(...)

我也没有看到任何允许我将org.apache.spark.sql.AnalysisException: Cannot resolve column name "col" among (x, y); at org.apache.spark.sql.DataFrame$$anonfun$resolve$1.apply(DataFrame.scala:152) at org.apache.spark.sql.DataFrame$$anonfun$resolve$1.apply(DataFrame.scala:152) at scala.Option.getOrElse(Option.scala:120) at org.apache.spark.sql.DataFrame.resolve(DataFrame.scala:151) at org.apache.spark.sql.DataFrame.col(DataFrame.scala:664) at org.apache.spark.sql.DataFrame.apply(DataFrame.scala:652) 设置为默认值的API方法。关于我哪里出错的任何想法?

1 个答案:

答案 0 :(得分:19)

您可以使用lit功能。首先你必须导入它

import org.apache.spark.sql.functions.lit

并按如下所示使用它

jsonDF.withColumn("z", lit("red"))

将自动推断列的类型。