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

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

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

  1. val list1= table.
  2. .select(col1)
  3. .collect().map(_(0)).toList
  4. val list2= table.
  5. .select(col2)
  6. collect().map(_(0)).toList

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

i5desfxk

i5desfxk1#

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

  1. column_to_list(DF,selectColumns)
  2. def column_to_list(inputdf:DataFrame,col_names:Seq[String]) =
  3. {
  4. col_names.map(colName => {
  5. val col_to_list = inputdf.select(colName).collectAsList()
  6. println(col_to_list)
  7. })
  8. }
qacovj5a

qacovj5a2#

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

  1. val list = table.select(
  2. collect_set($"col1").as("col1"),
  3. collect_set($"col2").as("col2")
  4. )
  5. .map(c => (c.getAs[Seq[String]](0),c.getAs[Seq[String]](1)))
  6. .collect
  7. val list1 = list.head
  8. val list2 = list.tail
1hdlvixo

1hdlvixo3#

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

  1. val table = spark.sql("select name, age from values ('bob', 1), ('sam', 2), ('bob', 1) T(name,age)")
  2. table.show(false)
  3. table.printSchema()
  4. /**
  5. * +----+---+
  6. * |name|age|
  7. * +----+---+
  8. * |bob |1 |
  9. * |sam |2 |
  10. * |bob |1 |
  11. * +----+---+
  12. *
  13. * root
  14. * |-- name: string (nullable = false)
  15. * |-- age: integer (nullable = false)
  16. */
  17. val rowArray = table.select($"name", $"age").collect()
  18. val nameList = rowArray.map(_(0)).toList.distinct
  19. val ageList = rowArray.map(_(1)).toList.distinct
  20. println(nameList.mkString(", "))
  21. println(ageList.mkString(", "))
  22. /**
  23. * bob, sam
  24. * 1, 2
  25. */
  26. val row = table.select(
  27. collect_set($"name").as("name"),
  28. collect_set($"age").as("age")
  29. ).head
  30. val nameSet = row.getAs[Seq[String]]("name")
  31. val ageSet = row.getAs[Seq[Int]]("age")
  32. println(nameSet.mkString(", "))
  33. println(ageSet.mkString(", "))
  34. /**
  35. * bob, sam
  36. * 1, 2
  37. */
展开查看全部

相关问题