检索行列值作为其Scala类型而不是列

时间:2019-02-08 08:49:03

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

我想要实现的是在考虑到每一行的值的情况下,将值推断为某些DataFrame列。

.withColumn("date", when(col("date").isNull, lit(new DateTime(col("timestamp").as[Long]).getYear)))

问题是我无法集中精力为每个Row对象检索给定列的值。我看过其他解决方案,但是它们要么列出所有行的整个值集,要么只是获得它们的第一个值,这不是我想要达到的目的。

像这样的示例DF图像...

(year, val1, val2, val3, timestamp)
(null, 10,   12,   null, 123456789)
(null, 11,   12,   null, 234567897)

在将各个函数(例如,从时间戳中提取年份)应用到每个行之后,我想看到的是...

(year,                        val1, val2, val3, timestamp)
(2018 [using DateTime class], 10,   12,   1012, 123456789)
(2018 [using DateTime class], 12,   12,   1212, 234567897)

有什么办法吗?

1 个答案:

答案 0 :(得分:1)

这是 UDF 发挥作用的地方:

val udf_extractYear = udf((ts:Long) => new DateTime(ts).getYear)

然后您可以使用例如

df
.withColumn("year", when(col("year").isNull, udf_extractYear(col("timestamp"))).otherwise(col("year")))
.show()

如您所见,您的timestamp列已自动映射到Long