【问题标题】:Spark Scala DataFrame and DataSet achieving desired out [duplicate]Spark Scala DataFrame 和 DataSet 实现所需的输出 [重复]
【发布时间】:2020-11-06 00:42:20
【问题描述】:

我有一个如下的数据框

scala> df.show
+----+------+
|SLNO|Values|
+----+------+
|   A|     y|
|   A|     t|
|   A|     e|
|   B|     f|
|   C|     g|
|   B|     h|
|   C|     k|
|   C|     u|
|   B|     p|
+----+------+

预计会是:

SLNO Values
A    y,t,e
B    f,h,p
C    g,k,u

如何通过 Spark Scala 的 DataFrame 和 DataSet 模型实现这一点?

我在数据集中尝试了类似下面的方法,但在此之后被击中

    scala> ds.filter(line=> line.split("\t")(0).size <=1 ).map(line => Map(line.split("\t")(0) -> line.split("\t")(1)))
res86:org.apache.spark.sql.Dataset[scala.collection.immutable.Map[String,String]] = [value: map<string,string>]

// 不知道如何进一步分组

【问题讨论】:

    标签: scala dataframe apache-spark dataset


    【解决方案1】:

    检查下面的代码。

    scala> df.show(false)
    +----+------+
    |slno|values|
    +----+------+
    |A   |y     |
    |A   |t     |
    |A   |e     |
    |B   |f     |
    |C   |g     |
    |B   |h     |
    |C   |k     |
    |C   |u     |
    |B   |p     |
    +----+------+
    
    
    scala> df
    .groupBy("slno")
    .agg(concat_ws(",",collect_list($"values")).as("values"))
    .orderBy($"slno".asc)
    .show(false)
    
    +----+------+
    |slno|values|
    +----+------+
    |A   |y,t,e |
    |B   |f,h,p |
    |C   |g,k,u |
    +----+------+
    
    scala> case class Example(slno: String,values:String)
    defined class Example
    
    scala> val ds = Seq(Example("A","y"),Example("A","t"),Example("A","e"),Example("B","f"),Example("C","g"),Example("B","h"),Example("C","k"),Example("C","u"),Example("B","p")).toDS
    
    scala> ds
    .groupBy("slno")
    .agg(concat_ws(",",collect_list($"values")).as("values"))
    .orderBy($"slno".asc)
    .show(false)
    +----+------+
    |slno|values|
    +----+------+
    |A   |y,t,e |
    |B   |f,h,p |
    |C   |g,k,u |
    +----+------+
    

    【讨论】:

    • 非常感谢。您的解决方案通过 Dataframe 解决了该问题。如果您熟悉 Dataset,请您通过 Dataset 提供相同的解决方案。
    • 已添加代码,立即查看。
    【解决方案2】:
    df.createOrReplaceTempView("df")
    spark.sql("select SLNO, array_join(collect_list(Values), ',') as Values from df group by SLNO") 
    

    【讨论】:

    • 非常感谢。您的解决方案通过 Spark SQL 工作。如果您熟悉 Dataset,能否通过 Dataset 提供相同的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2020-08-11
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2021-08-30
    相关资源
    最近更新 更多