spark:如何将单个列从一个arraytype列收集到另一个数组?

b5lpy0ml  于 2021-07-09  发布在  Spark
关注(0)|答案(2)|浏览(325)

我有一个专栏叫 requests 它是arraytype,里面有几个字段 code , value

StructField(requests,ArrayType(StructType(StructField(code,IntegerType,true), StructField(value,DoubleType,true) .....)

比如说 [[1, 5.0....], [2, 0, ....]] 等。
我如何收集 code 数组中的字段 [1,2....] ? 我对其他领域不感兴趣 requests .
我试过用 array_zip 但这没用:

val result = df.withColumn("new_col", arrays_zip(col("requests.code")))

我一定要用吗 explode ? 或者这是可能的使用高阶函数?提前谢谢!

tuwxkamq

tuwxkamq1#

你得到一个数组 code 通过访问 requests 数组:

val result = df.withColumn("new_col", col("requests")("code"))

或者使用列方法 getItem , getField :

val result = df.withColumn("new_col", col("requests").getField("code"))

例子:

result.show(false)
//+----------------------------------------+------------+
//|requests                                |new_col     |
//+----------------------------------------+------------+
//|[[1, 1.5], [2, 2.5], [3, 3.5], [4, 4.5]]|[1, 2, 3, 4]|
//+----------------------------------------+------------+
7gs2gvoe

7gs2gvoe2#

可以使用高阶函数 transform 对于Spark>=2.4:

val result = df.withColumn("new_col", expr("transform(requests, x -> x.code)"))

如果spark>=3.0,还可以使用scalaDataframeapi transform :

val result = df.withColumn("new_col", transform(col("requests"), x => x("code")))

// or more simply
val result = df.withColumn("new_col", transform(col("requests"), _("code")))

相关问题