![](/img/trans.png)
[英]Create 2D array and store value into each element of that array in Scala
[英]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
我可以稍后使用list1
和list2
在第三個數據集上應用過濾器。 但正如您所見,這涉及兩次掃描table
。 有沒有辦法在不閱讀表格兩次的情況下做到這一點?
檢查下面的代碼。
假設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
希望您表中的數據較少,然后試試這個 -
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.