【问题标题】:Convert Array of String column to multiple columns in spark scala将字符串列数组转换为spark scala中的多列
【发布时间】:2018-05-29 00:31:32
【问题描述】:

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

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,@ 的多个列987654326@和zip

.withColumn("empname", xxx)
.withColumn("city", yyy)
.withColumn("zip", 12345)

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

非常感谢您的帮助...

非常感谢

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

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

    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|
    +---+-------+----+---+
    

    希望这会有所帮助!

    【讨论】:

    • 感谢您的快速回复,非常感谢您的帮助。我还有一个观察结果,如果数组中的值总是不同的顺序。例如,我可能会得到一个数组作为 (city,zip,empname),而另一个记录可能会得到 (empname,city,zip)。如果这些位置是动态变化的,我们如何读取它?是否有任何选项可以根据名称读取..
    • @Bab 请检查更新的答案。现在,数据在数组中的方式无关紧要。
    • 嗨,对于继续上述问题,有时某些键值对可能不会出现在数据帧的列(字符串数组)中。我们如何动态处理它。例如,在某些记录中,zip 可能会存在,也可能不存在。我们是否有任何选择来处理这种情况。提前致谢
    • 这取决于你,你可以通过检查地图返回null或空字符串。
    • 如果你不介意,你能举个例子,如果 key 不存在,则返回 null。
    猜你喜欢
    • 2017-11-03
    • 2017-11-25
    • 2022-01-17
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多