【问题标题】:Combine two lists with one different element将两个列表与一个不同的元素组合在一起
【发布时间】:2020-01-27 14:46:03
【问题描述】:

我是 Scala 和 Spark 的新手,我不知道该怎么做。

我已经预处理了一个 CSV 文件,生成了一个包含这种格式的列表的 RDD:

List("2014-01-01T23:56:06.0", NaN, 1, NaN)
List("2014-01-01T23:56:06.0", NaN, NaN, 2)

所有列表都有相同数量的元素。

我想要做的是组合具有相同第一个元素(时间戳)的列表。例如,我希望这两个示例列表只生成一个列表,具有以下值:

List("2014-01-01T23:56:06.0", NaN, 1, 2)

感谢您的帮助:)

【问题讨论】:

  • 所以您正在寻找 group by 时间戳。要么你切换到数据框,你可以使用groupBy,或者你可以继续使用RDD,使用rdd.map(list => list.head -> list.tail).reduceByKey(yourReduceFunc)之类的东西。
  • List 不应该这样使用。 List[Any] 没用。你需要一个case class A(datetime: String, a: Double, b : Double, c: Doule) 和一个List[A] 的列表。你可以groupBy(_.datetime) 然后减少结果的右边部分。

标签: scala list apache-spark


【解决方案1】:
    # Below can help you in achieving your target

    val input_rdd1 = spark.sparkContext.parallelize(List(("2014-01-01T23:56:06.0", "NaN", "1", "NaN")))
    val input_rdd2 = spark.sparkContext.parallelize(List(("2014-01-01T23:56:06.0", "NaN", "NaN", "2")))
    //added one more row for your data
    val input_rdd3 = spark.sparkContext.parallelize(List(("2014-01-01T23:56:06.0", "2", "NaN", "NaN")))
    val input_df1 = input_rdd1.toDF("col1", "col2", "col3", "col4")
    val input_df2 = input_rdd2.toDF("col1", "col2", "col3", "col4")
    val input_df3 = input_rdd3.toDF("col1", "col2", "col3", "col4")

    val output_df = input_df1.union(input_df2).union(input_df3).groupBy($"col1").agg(min($"col2").as("col2"), min($"col3").as("col3"), min($"col4").as("col4"))

    output_df.show

output:
+--------------------+----+----+----+
|                col1|col2|col3|col4|
+--------------------+----+----+----+
|2014-01-01T23:56:...|   2|   1|   2|
+--------------------+----+----+----+

【讨论】:

    【解决方案2】:

    如果数组尾值是双精度的,可以这样实现(正如 sachav 建议的那样):

    val original = sparkContext.parallelize(
      Seq(
        List("2014-01-01T23:56:06.0", NaN, 1.0, NaN),
        List("2014-01-01T23:56:06.0", NaN, NaN, 2.0)
      )
    )
    
    val result = original
      .map(v => v.head -> v.tail)
      .reduceByKey(
        (acc, curr) => acc.zip(curr).map({ case (left, right) => if (left.asInstanceOf[Double].isNaN) right else left }))
      .map(v => v._1 :: v._2)
    
    result.foreach(println)
    

    输出是:

    List(2014-01-01T23:56:06.0, NaN, 1.0, 2.0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 2017-03-15
      • 1970-01-01
      • 2021-09-19
      相关资源
      最近更新 更多