如何将 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]?

Scala - 如何将 Dataset[Row] 转换为可添加到 Dataframe 的列

如何将 RDD[Row] 转换为 RDD[Vector]