在迭代其记录时向Spark数据集添加多个列

时间:2017-07-27 13:44:28

标签: apache-spark

Spark 2.1.x在这里。我有一堆JSON文件(具有相同的架构),我正在阅读单个Spark Dataset,如下所示:

val ds = spark.read.json("some/path/to/lots/of/json/*.json")

然后我可以打印ds架构并看到所有内容都已正确读取:

ds.printSchema()

// Outputs:
root
 |-- fizz: boolean (nullable = true)
 |-- moniker: string (nullable = true)
 |-- buzz: string (nullable = true)
 |-- foo: string (nullable = true)
 |-- bar: string (nullable = true)

请注意moniker字符串列。我现在想:

  1. 向此数据集和/或其架构添加三个新列; (a)名为special_date的日期/时间列,(b)名为special_uuid的UUID列和(c)名为special_phrase的字符串列;然后
  2. 我需要迭代ds中的所有记录,并为每条记录将其moniker值传递给三个后续函数:(a)deriveSpecialDate(val moniker : String) : Date,(b){{ 1}}和(c)deriveSpecialUuid(val moniker : String) : UUID。然后,每个函数的输出都需要成为相应列的记录值。
  3. 我最好的尝试:

    deriveSpecialPhrase(val moniker : String) : String

    知道如何实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

我将使用spark

中的udf(用户定义函数)增强3列的原始数据集
val deriveSpecialDate = udf((moniker: String) => // implement here)
val deriveSpecialUuid= udf((moniker: String) => // implement here)
val deriveSpecialPhrase = udf((moniker: String) => // implement here)

之后你可以这样做:

ds.withColumn("special_date", deriveSpecialDate(col("moniker)))
.withColumn("special_uuid", deriveSpecialUuid(col("moniker)))
.withColumn("special_phrase", deriveSpecialPhrase (col("moniker)))

它将为您带来一个包含三列的新数据框。如果需要,还可以使用地图功能

转换为数据集

答案 1 :(得分:0)

要创建新列,您可以使用withColumn。如果您已经有一个函数,则需要将该函数注册为UDF(用户定义函数)

val sd = sqlContext.udf.register("deriveSpecialDate",deriveSpecialDate _ )
val su = sqlContext.udf.register("deriveSpecialUuid",deriveSpecialUuid _ )
val sp = sqlContext.udf.register("deriveSpecialPhrase", deriveSpecialPhrase _)

要使用此udf,您需要withcolumn,它将创建一个新列

ds.withColumn("special_date", sd($"moniker))
 .withColumn("special_uuid", su($"moniker))
 .withColumn("special_phrase", sp($"moniker))

通过这个,您可以获得三个新添加的列的原始数据集。