【问题标题】:Spark - union dataframe rows into one rowSpark - 将数据框行合并为一行
【发布时间】:2017-03-10 04:23:20
【问题描述】:

我的数据框包含具有相同 ID 的行。 我需要将所有具有相同 id 的行合并为一行(一个 json)

以下是数据示例:

id  first_name   last_name
1    JAMES         SMITH
2    MARY          BROWN
2    DAVID         WILLIAMS
1    ROBERT        DAVIS

请求的结果是:

{
  id:1,
  entities: [{
    first_name:JAMES,
    last_name:SMITH 
   }, {
    first_name:ROBERT,
    last_name:DAVIS
  }]
}
{
  id:2,
  entities: [{
    first_name:MARY,
    last_name:BROWN 
   }, {
    first_name:DAVID,
    last_name:WILLIAMS
  }]
}  

可以吗?

问候,亚尼夫

【问题讨论】:

    标签: scala apache-spark dataframe apache-spark-sql


    【解决方案1】:

    在将相关列“合并”成单个嵌套结构后,您可以使用groupBycollect_list

    val input: DataFrame = Seq(
      (1, "JAMES", "SMITH"),
      (2, "MARY", "BROWN"),
      (2, "DAVID", "WILLIAMS"),
      (1, "ROBERT", "DAVIS")
    ).toDF("id", "first_name", "last_name")
    
    import org.apache.spark.sql.functions._
    val result = input
      .withColumn("entity", struct($"first_name", $"last_name"))
      .groupBy("id").agg(collect_list($"entity"))
    
    result.show(false)
    // +---+--------------------------------+
    // |id |entities                        |
    // +---+--------------------------------+
    // |1  |[[JAMES,SMITH], [ROBERT,DAVIS]] |
    // |2  |[[MARY,BROWN], [DAVID,WILLIAMS]]|
    // +---+--------------------------------+
    
    result.printSchema()
    // root
    //  |-- id: integer (nullable = false)
    //  |-- entities: array (nullable = true)
    //  |    |-- element: struct (containsNull = true)
    //  |    |    |-- first_name: string (nullable = true)
    //  |    |    |-- last_name: string (nullable = true)
    

    【讨论】:

    • 不知道collect_list及其用法,谢谢。
    • 感谢 Tzach 的回答,但是当我尝试运行代码时出现异常:AnalysisException: undefined function collect_list
    • 哦,我认为这意味着你应该在依赖项中包含"org.apache.spark" %% "spark-hive"(除了"org.apache.spark" %% "spark-sql"),因为这个函数的实现是在Spark的Hive支持中......
    • 我发现我应该使用HiveContext而不是SQLContext来加载数据。这是正确的做法吗?
    • 看起来是这样,至少在 Spark 1.6 中(在 Spark 2.0 中,上下文之间没有真正的区别,因此这也适用于 SQLContext/SparkSession)
    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2021-02-08
    • 2013-06-01
    • 2022-01-14
    相关资源
    最近更新 更多