如何从scala数据框中的数组列访问值

问题描述 投票:0回答:1

我有一个数据帧,其元组的scala数组(索引,值)如下所示,索引的值从1到4

id  | units_flag_tuples

id1 | [(3,2.0), (4,6.0)]

id2 | [(1,10.0), (2,2.0), (3,5.0)]

我想从数组访问值并将其基于索引(unit1,unit2,unit3,unit4)放入列中:

ID | unit1| unit2 | unit3 | unit 4

id1 | null | null  | 2.0   | 6.0

id2 | 10.0 | 2.0   | 5.0   | null

这里是代码:

df
.withColumn("unit1", col("units_flag_tuples").find(_._1 == '1').get._2  )
.withColumn("unit2", col("units_flag_tuples").find(_._1 == '2').get._2  )
.withColumn("unit3", col("units_flag_tuples").find(_._1 == '3').get._2  )
.withColumn("unit4", col("units_flag_tuples").find(_._1 == '4').get._2  )

这是我收到的错误消息:

错误:值查找不是org.apache.spark.sql.Column的成员

如何解决此错误或其他更好的解决方法?

scala dataframe tuples element access
1个回答
0
投票

这是我的另一种方法,我使用map_from_entries函数为数组创建映射,并通过从映射中选择键来获取每一列。

val df = Seq(("id1", Seq((3,2.0), (4,6.0))), ("id2", Seq((1,10.0), (2,2.0), (3,5.0)))).toDF("id", "units_flag_tuples")
df.show(false)

df.withColumn("map", map_from_entries(col("units_flag_tuples")))
  .withColumn("unit1", col("map.1"))
  .withColumn("unit2", col("map.2"))
  .withColumn("unit3", col("map.3"))
  .withColumn("unit4", col("map.4"))
  .drop("map", "units_flag_tuples").show

结果是:

+---+-----+-----+-----+-----+
| id|unit1|unit2|unit3|unit4|
+---+-----+-----+-----+-----+
|id1| null| null|  2.0|  6.0|
|id2| 10.0|  2.0|  5.0| null|
+---+-----+-----+-----+-----+
© www.soinside.com 2019 - 2024. All rights reserved.