簡體   English   中英

SCALA:將 select 的 output 從 Z6A8064B5DF479450550DZ534 數組存儲到 AC245

[英]SCALA: Store the output of select from a dataframe into a 2D array

我有一個有 10 列的表,但我只對 2 列感興趣。 我想將每個列中的不同值存儲到一個列表中,稍后我需要在程序中使用它。 這是我嘗試過的:

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

我可以稍后使用list1list2在第三個數據集上應用過濾器。 但正如您所見,這涉及兩次掃描table 有沒有辦法在不閱讀表格兩次的情況下做到這一點?

檢查下面的代碼。

假設col1 & col2string類型。

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

希望您表中的數據較少,然后試試這個 -

 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
      */

您可以嘗試創建一個 function ,它將您要轉換的列按順序轉換並將其更改為列表

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)
    })

  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM