【问题标题】:Join two array column in squence - scala按顺序连接两个数组列 - scala
【发布时间】:2020-04-07 01:53:03
【问题描述】:

我有一个包含两个 Array 列的数据框,试图通过依次连接 A 和 B 来创建一个新列。

val df = Seq((Seq("a","b","c"),Seq("d","5","6"))).toDF("A","B")

预期输出:

C: ["a d", "b 5", "c 6"]

我正在探索这两个数组并使用“import org.apache.spark.sql.functions.array”函数再次加入它,但它没有给出预期的结果。

【问题讨论】:

    标签: scala apache-spark databricks


    【解决方案1】:

    使用arrays_zip函数得到了预期的结果,如下所示:

    import org.apache.spark.sql.functions.arrays_zip
    val output = df.withColumn(
     "zipped", arrays_zip($"A", $"B")
    )
    

    【讨论】:

      【解决方案2】:

      我认为 Spark 没有现成的功能。您可以在这里使用用户定义的函数zip 例如:

      import spark.implicits._
      def zipFunc: (Seq[String], Seq[String]) => Seq[String] = (x: Seq[String], y: Seq[String]) => 
        x.zip(y).map{ case (xi, yi) => s"$xi $yi"}
      
      val df = Seq(
        (Seq("a","b","c"), Seq("d","5","6"))
      ).toDF("A","B")
      df.printSchema()
      val zipUDF = spark.udf.register("zipUdf", zipFunc)
      df.withColumn("C", zipUDF($"A", $"B")).show()
      

      打印:

      +---------+---------+---------------+
      |        A|        B|              C|
      +---------+---------+---------------+
      |[a, b, c]|[d, 5, 6]|[a d, b 5, c 6]|
      +---------+---------+---------------+
      

      【讨论】:

      • 它在示例中运行良好,但是当我替换表的列时,我得到一个 Task not serializable 错误
      • @VSr 我更新了答案,但你的决定更好。
      猜你喜欢
      • 2017-03-30
      • 2016-06-17
      • 2018-03-06
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      相关资源
      最近更新 更多