scala—如何编写代码来创建一个数据集,其中的列将数组列的元素作为值,其名称作为位置?

goucqfw6  于 2021-05-29  发布在  Spark
关注(0)|答案(2)|浏览(329)

输入数据:

val inputDf = Seq(Seq("a", "b", "c"), Seq("X", "Y", "Z")).toDF
    println("Input:")
    inputDf.show(false)

下面是如何查看输入:

+---------+
    |value    |
    +---------+
    |[a, b, c]|
    |[X, Y, Z]|
    +---------+

以下是期望的外观:

+---+---+---+
    |0  |1  |2  |
    +---+---+---+
    |a  |b  |c  |
    |X  |Y  |Z  |
    +---+---+---+

我试着使用这样的代码:

val ncols = 3

    val selectCols = (0 until  ncols).map(i => $"arr"(i).as(s"col_$i"))

    inputDf
      .select(selectCols:_*)
      .show()

但我有错误,因为我需要一些:单位

px9o7tmv

px9o7tmv1#

package spark

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.col

object ArrayToCol extends App {
  val spark = SparkSession.builder()
    .master("local")
    .appName("DataFrame-example")
    .getOrCreate()

  import spark.implicits._
  val inptDf = Seq(Seq("a", "b", "c"), Seq("X", "Y", "Z")).toDF("value")
  val d = inptDf
    .withColumn("0", col("value").getItem(0))
    .withColumn("1", col("value").getItem(1))
    .withColumn("2", col("value").getItem(2))
    .drop("value")

  d.show(false)

}
// Variant 2
val res = inptDf.select(
    $"value".getItem(0).as("col0"),
    $"value".getItem(1).as("col1"),
    $"value".getItem(2).as("col2")
  )
// Variant 3
val res1 = inptDf.select(
    col("*") +: (0 until 3).map(i => col("value").getItem(i).as(s"$i")): _*
  )
    .drop("value")
weylhg0b

weylhg0b2#

创建Dataframe的另一种方法---

df1 = spark.createDataFrame([(1,[4,2, 1]),(4,[3,2])], [ "col2","col4"])

输出---------

+----+---------+
|col2|     col4|
+----+---------+
|   1|[4, 2, 1]|
|   4|   [3, 2]|
+----+---------+

相关问题