使用Spark Scala使用现有列添加新列

时间:2017-10-09 09:39:39

标签: scala apache-spark

您好我想在DataFrame的每一行中使用现有列添加新列,我在Spark Scala中尝试这样... df是包含可变列数的数据帧,只能在运行时决定。

// Added new column "docid"
val df_new = appContext.sparkSession.sqlContext.createDataFrame(df.rdd, df.schema.add("docid", DataTypes.StringType))

 df_new.map(x => {
        import appContext.sparkSession.implicits._
      val allVals = (0 to x.size).map(x.get(_)).toSeq
      val values = allVals ++ allVals.mkString("_") 
      Row.fromSeq(values)
    }) 

但这就是错误就是日食本身

  • 无法找到存储在数据集中的类型的编码器。导入spark.implicits支持原始类型(Int,String等)和产品类型(case类)。在将来的版本中将添加对序列化其他类型的支持。
  • 方法映射的参数不够:(隐式证据$ 7:org.apache.spark.sql.Encoder [org.apache.spark.sql.Row])org.apache.spark.sql.Dataset [org.apache。 spark.sql.Row。未指定的值参数证据$ 7。

请帮忙。

2 个答案:

答案 0 :(得分:1)

functions object中的

concat_ws可以提供帮助。

此代码添加了docid字段

df = df.withColumn("docid", concat_ws("_", df.columns.map(df.col(_)):_*))

假设df的所有列都是字符串。

答案 1 :(得分:0)

使用UDF和withColumn Api

可以更好地完成