Scala将数组[String]的列连接到单个数组[String]

Scala将数组[String]的列连接到单个数组[String],scala,apache-spark,dataframe,data-science,Scala,Apache Spark,Dataframe,Data Science,我有一个Spark数据帧(Scala),带有id-(Int)和tokens-(array)列: id,tokens 0,["a","b","c"] 1,["a","b"] ... 假设我能够通过SparkSession检索数据并转换到case类: case class Token(id: Int, tokens: Array[String]) 获取数据集[Token]对象后,如何将所有字符串标记数组连接到单个数组中,然后执行计数以查找最常出现的字符串 输出: a,2 b,2 c,1 ...

我有一个Spark数据帧(Scala),带有
id-(Int)
tokens-(array)
列:

id,tokens
0,["a","b","c"]
1,["a","b"]
...
假设我能够通过SparkSession检索数据并转换到case类:

case class Token(id: Int, tokens: Array[String])
获取
数据集[Token]
对象后,如何将所有字符串标记数组连接到单个
数组中,然后执行计数以查找最常出现的字符串

输出:

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

您需要分解标记列,并在按单个标记分组后计数:

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
输出:

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

您需要分解标记列,并在按单个标记分组后计数:

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
输出:

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

谢谢你的回答!另外,我们可以使用
.count()
而不是
agg(count($“id”)作为“count”)
:)@Ivan,是的,这是真的,甚至
.count()
也可以工作。我明确使用了
.agg()
,以避免这样的混淆:谢谢你的回答!另外,我们可以使用
.count()
而不是
agg(count($“id”)作为“count”)
:)@Ivan,是的,这是真的,甚至
.count()
也可以工作。我明确使用了
.agg()
,以避免类似的混淆: