scala:将select的输出从Dataframe存储到2d数组中

krcsximq  于 2021-05-29  发布在  Spark
关注(0)|答案(3)|浏览(403)

我有一个10列的表,但我只对2列感兴趣。我想将每个列的不同值存储到一个列表中,稍后在程序中使用。以下是我尝试过的:

val list1= table.
                         .select(col1)
                         .collect().map(_(0)).toList
         val list2= table.
                         .select(col2)
                         collect().map(_(0)).toList

我可以用 list1 以及 list2 稍后在第三个数据集上应用过滤器。但正如你所见,这需要扫描 table 两次。有没有办法不用看两遍table就能做到这一点?

i5desfxk

i5desfxk1#

您可以尝试创建一个函数,该函数接受要按顺序转换的列,并将其更改为list
val selectcolumns=df.columns.toseq

column_to_list(DF,selectColumns)

def column_to_list(inputdf:DataFrame,col_names:Seq[String])  =
  {
    col_names.map(colName => {
      val col_to_list = inputdf.select(colName).collectAsList()
      println(col_to_list)
    })

  }
qacovj5a

qacovj5a2#

检查以下代码。
假设 col1 & col2 属于 string .

val list = table.select(
    collect_set($"col1").as("col1"),
    collect_set($"col2").as("col2")
)
.map(c => (c.getAs[Seq[String]](0),c.getAs[Seq[String]](1)))
.collect

val list1 = list.head
val list2 = list.tail
1hdlvixo

1hdlvixo3#

希望表中的数据少一点,试试这个-

val table = spark.sql("select name, age from values ('bob', 1), ('sam', 2), ('bob', 1) T(name,age)")
    table.show(false)
    table.printSchema()
    /**
      * +----+---+
      * |name|age|
      * +----+---+
      * |bob |1  |
      * |sam |2  |
      * |bob |1  |
      * +----+---+
      *
      * root
      * |-- name: string (nullable = false)
      * |-- age: integer (nullable = false)
      */
    val rowArray = table.select($"name", $"age").collect()
    val nameList = rowArray.map(_(0)).toList.distinct
    val ageList = rowArray.map(_(1)).toList.distinct
    println(nameList.mkString(", "))
    println(ageList.mkString(", "))

    /**
      * bob, sam
      * 1, 2
      */

    val row = table.select(
      collect_set($"name").as("name"),
      collect_set($"age").as("age")
    ).head

    val nameSet = row.getAs[Seq[String]]("name")
    val ageSet = row.getAs[Seq[Int]]("age")
    println(nameSet.mkString(", "))
    println(ageSet.mkString(", "))

    /**
      * bob, sam
      * 1, 2
      */

相关问题