将Array of String列转换为spark scala中的多个列

Bab*_*Bab 0 scala apache-spark

我有一个包含以下架构的数据框:

id         : int,
emp_details: Array(String)
Run Code Online (Sandbox Code Playgroud)

一些样本数据:

1, Array(empname=xxx,city=yyy,zip=12345)
2, Array(empname=bbb,city=bbb,zip=22345)
Run Code Online (Sandbox Code Playgroud)

这个数据存在于数据框中,我需要emp_details从数组中读取并将其分配给新列,如下所示,或者如果我可以split将此数组分配给列名为的多列empname,city并且zip:

.withColumn("empname", xxx)
.withColumn("city", yyy)
.withColumn("zip", 12345)
Run Code Online (Sandbox Code Playgroud)

你能指导我们如何使用Spark(1.6)Scala实现这一目标.

真的很感谢你的帮助......

非常感谢

Sha*_*ala 5

您可以使用withColumnsplit获取所需的数据

df1.withColumn("empname", split($"emp_details" (0), "=")(1))
  .withColumn("city", split($"emp_details" (1), "=")(1))
  .withColumn("zip", split($"emp_details" (2), "=")(1)) 
Run Code Online (Sandbox Code Playgroud)

输出:

+---+----------------------------------+-------+----+-----+
|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|
+---+----------------------------------+-------+----+-----+
Run Code Online (Sandbox Code Playgroud)

更新:
如果您没有固定的数据序列,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"))
})
Run Code Online (Sandbox Code Playgroud)

现在使用udf

df1.withColumn("emp",getColumnsUDF($"emp_details"))
 .select($"id", $"emp._1".as("empname"), $"emp._2".as("city"), $"emp._3".as("zip"))
 .show(false)
Run Code Online (Sandbox Code Playgroud)

输出:

+---+-------+----+---+
|id |empname|city|zip|
+---+-------+----+---+
|1  |xxx    |xxx |xxx|
|2  |bbb    |bbb |bbb|
+---+-------+----+---+
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!