如何将 seq[row] 转换为 scala 中的数据框
Posted
技术标签:
【中文标题】如何将 seq[row] 转换为 scala 中的数据框【英文标题】:how to convert seq[row] to a dataframe in scala 【发布时间】:2021-03-01 11:34:44 【问题描述】:有什么方法可以将 Seq[Row] 转换为 scala 中的数据帧。 我有一个数据框和一个字符串列表,其中包含输入数据框中每一行的权重。我想构建一个包含所有具有唯一权重的行的数据框。 我能够过滤唯一的行并附加到 seq[row] 但我想构建一个数据框。 这是我的代码。提前致谢。
def dataGenerator(input : DataFrame, val : List[String]): Dataset[Row]=
val valitr = val.iterator
var testdata = Seq[Row]()
var val = HashSet[String]()
if(valitr!=null)
input.collect().foreach((r) =>
var valnxt = valitr.next()
if (!valset.contains(valnxt))
valset += valnxt
testdata = testdata :+ r
)
//logic to convert testdata as DataFrame and return
【问题讨论】:
您真的需要收集来执行此操作吗?如果您尝试使用 DataFrame 方法执行此操作(我期望在这种情况下可能是过滤器),那么您会发现您不需要将 Seq[Row] 转换为 DataFrame @mikelegg 你能详细解释一下我如何使用过滤功能来实现这一点 我不确定我理解你想要做什么,请澄清。 '输入'中的每一行的'val'中是否有一个元素?他们以相同的顺序一起去吗?而且您只想在对应的“val”条目相同的情况下包含第一行? 是的,对于我的数据框中的每一行,val 列表中都有相应的值。现在,如果两行对应相同的值,我只想包含第一行。 那么可能是与订购有关的问题。使用“input”和“val”之间关系的顺序可能不好。你怎么知道'input'的顺序与'val'相同?输入数据帧的顺序是否已知? 【参考方案1】:您说'val 是使用 inputdf 本身的字段计算的'。如果是这种情况,那么您应该能够为“val”创建一个新的数据框,如下所示:
+------+------+
|item |weight|
+------+------+
|item 1|w1 |
|item 2|w2 |
|item 3|w2 |
|item 4|w3 |
|item 5|w4 |
+------+------+
这是关键。然后您将能够处理数据框而不是进行收集。
收集有什么不好?好吧,使用分布式大数据处理框架只是将所有数据拉入一台机器的内存,这是没有意义的。见这里:Spark dataframe: collect () vs select ()
当你有你想要的输入数据框时,如上所述,你可以得到结果。这是一种可行的方法,它按权重列对数据进行分组,并为每个分组选择第一项。
val result = input
.rdd // get underlying rdd
.groupBy(r => r.get(1)) // group by "weight" field
.map(x => x._2.head.getString(0)) // get the first "item" for each weight
.toDF("item") // back to a dataframe
那么在重复重量的情况下,你会得到唯一的第一项:
+------+
|item |
+------+
|item 1|
|item 2|
|item 4|
|item 5|
+------+
【讨论】:
以上是关于如何将 seq[row] 转换为 scala 中的数据框的主要内容,如果未能解决你的问题,请参考以下文章
row.getList java.lang.ClassCastException:java.math.BigDecimal 不能转换为 scala.collection.Seq
如何在 Spark 2 Scala 中将 Row 转换为 json
如何从 Java 中的 Java 列表创建 scala.collection.immutable.Seq?
Scala 中有没有办法将 Seq[(String, String)] 转换为 Seq[String]?