我有一个包含以下架构的数据框:
id : int,
emp_details: Array(String)
一些示例数据:
1, Array(empname=xxx,city=yyy,zip=12345)
2, Array(empname=bbb,city=bbb,zip=22345)
这个数据存在于数据框中,我需要从数组中读取emp_details
并将其分配给新列,如下所示,或者我可以split
将此数组empname
列为多列,列名为{ {1}},city
和zip
:
.withColumn("empname", xxx)
.withColumn("city", yyy)
.withColumn("zip", 12345)
请您使用Spark(1.6)Scala指导我们如何实现这一目标。
非常感谢你的帮助...
非常感谢
答案 0 :(得分:5)
您可以使用withColumn
和split
来获取所需的数据
df1.withColumn("empname", split($"emp_details" (0), "=")(1))
.withColumn("city", split($"emp_details" (1), "=")(1))
.withColumn("zip", split($"emp_details" (2), "=")(1))
输出:
+---+----------------------------------+-------+----+-----+
|id |emp_details |empname|city|zip |
+---+----------------------------------+-------+----+-----+
|1 |[empname=xxx, city=yyy, zip=12345]|xxx |yyy |12345|
|2 |[empname=bbb, city=bbb, zip=22345]|bbb |bbb |22345|
+---+----------------------------------+-------+----+-----+
<强>更新强>
如果您在array
中没有固定的数据序列,那么您可以使用UDF
转换为map
并将其用作
val getColumnsUDF = udf((details: Seq[String]) => {
val detailsMap = details.map(_.split("=")).map(x => (x(0), x(1))).toMap
(detailsMap("empname"), detailsMap("city"),detailsMap("zip"))
})
现在使用udf
df1.withColumn("emp",getColumnsUDF($"emp_details"))
.select($"id", $"emp._1".as("empname"), $"emp._2".as("city"), $"emp._3".as("zip"))
.show(false)
输出:
+---+-------+----+---+
|id |empname|city|zip|
+---+-------+----+---+
|1 |xxx |xxx |xxx|
|2 |bbb |bbb |bbb|
+---+-------+----+---+
希望这有帮助!