【问题标题】:Transform rows to columns in Spark Scala SQL在 Spark Scala SQL 中将行转换为列
【发布时间】:2015-12-05 14:02:54
【问题描述】:

我有一个包含唯一用户 ID 和点击的项目的数据库表。
例如

用户 ID,项目 ID
1 , 345
1 , 78993
1 , 784
5、345
5、897
15, 454

我想使用 spark SQL 将这些数据转换为以下格式(如果可能在 Scala 中)

用户 ID,项目 ID
1、345、78993、784
5, 345,897
15, 454

谢谢,

【问题讨论】:

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


    【解决方案1】:

    这是一个非常简单的groupByKey 场景。虽然如果你想在之后用它做其他事情,那么我建议使用更高效的PairRDDFunction,因为groupByKey 对于后续查询效率低。

    【讨论】:

      【解决方案2】:

      本地示例:

      import org.apache.spark.sql.SQLContext
      import org.apache.spark.sql.hive.HiveContext
      import org.apache.spark.{SparkConf, SparkContext}
      import org.apache.spark.sql.functions._
      
      
      object Main extends App {
      
        case class Record(user: Int, item: Int)
      
        val items = List(
          Record(1 , 345),
          Record(1 , 78993),
          Record(1 , 784),
          Record(5, 345),
          Record(5, 897),
          Record(15, 454)
        )
      
        val sc = new SparkContext(new SparkConf().setAppName("test").setMaster("local"))
        val hiveContext = new HiveContext(sc)
        import hiveContext.implicits._
        import hiveContext.sql
      
        val df = sc.parallelize(items).toDF()
        df.registerTempTable("records")
        sql("SELECT * FROM records").collect().foreach(println)
      
        sql("SELECT user, collect_set(item) From records group by user").collect().foreach(println)
      }
      

      这会产生:

      [1,ArrayBuffer(78993, 784, 345)]
      [5,ArrayBuffer(897, 345)]
      [15,ArrayBuffer(454)]
      

      【讨论】:

        猜你喜欢
        • 2022-01-05
        • 2019-02-20
        • 2020-05-30
        • 2020-02-09
        • 2018-06-24
        • 2020-08-11
        • 1970-01-01
        • 2017-02-26
        • 1970-01-01
        相关资源
        最近更新 更多