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
字符串列。我现在想:
special_date
的日期/时间列,(b)名为special_uuid
的UUID列和(c)名为special_phrase
的字符串列;然后ds
中的所有记录,并为每条记录将其moniker
值传递给三个后续函数:(a)deriveSpecialDate(val moniker : String) : Date
,(b){{ 1}}和(c)deriveSpecialUuid(val moniker : String) : UUID
。然后,每个函数的输出都需要成为相应列的记录值。我最好的尝试:
deriveSpecialPhrase(val moniker : String) : String
知道如何实现这一目标吗?
答案 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))
通过这个,您可以获得三个新添加的列的原始数据集。