Scala将数组[String]的列连接到单个数组[String]
我有一个Spark数据帧(Scala),带有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 ...
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()
,以避免类似的混淆: