【问题标题】:Scala concatenate Column of Array[String] into single Array[String]Scala 将 Array[String] 的列连接成单个 Array[String]
【发布时间】:2018-12-12 05:37:13
【问题描述】:

我有一个带有 id - (Int)tokens - (array<string>) 列的 Spark Dataframe (Scala):

id,tokens
0,["a","b","c"]
1,["a","b"]
...

假设我能够通过 SparkSession 检索数据并转换为案例类:

case class Token(id: Int, tokens: Array[String])

获得Dataset[Token] 对象后,如何将所有字符串标记数组连接成一个Array<String>,然后执行计数以查找出现次数最多的字符串?

输出:

a,2
b,2
c,1
...

【问题讨论】:

    标签: scala apache-spark dataframe data-science


    【解决方案1】:

    您需要explodetoken 列并在按单个令牌分组后进行计数:

    scala> val input = sc.parallelize(List(
      (0, Array("a","b","c")), 
      (1, Array("a","b"))
    )).toDF("id","token")
    
    scala> input.withColumn("token_split",explode($"token"))
             .groupBy($"token_split")
             .agg(count($"id") as "count")
             .orderBy($"count".desc)
             .show
    

    输出:

    +-----------+-----+
    |token_split|count|
    +-----------+-----+
    |          b|    2|
    |          a|    2|
    |          c|    1|
    +-----------+-----+
    

    【讨论】:

    • 感谢您的回答!要添加,我们可以使用 .count() 代替 agg(count($"id") as "count") :)
    • @Ivan,是的,没错,即使.count() 也有效。我已明确使用.agg() 以避免这样的混淆:stackoverflow.com/questions/52966347/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2019-03-05
    • 2015-01-24
    • 1970-01-01
    • 2018-08-16
    • 2021-04-02
    相关资源
    最近更新 更多