Apache spark Spark中数据帧列中值的计数频率
我有一个Spark数据框,其模式如下:Apache spark Spark中数据帧列中值的计数频率,apache-spark,dataframe,apache-spark-sql,Apache Spark,Dataframe,Apache Spark Sql,我有一个Spark数据框,其模式如下: root |-- name: string (nullable = true) |-- matches: string (nullable = false) 由以下值组成: inf1 -> inf1, inf2, inf3,inf1, inf2, inf3 inf2 -> inf1, inf2, inf3,inf1, inf2, inf3 inf3 -> inf3, inf1, inf4 inf4 -> inf1, inf2,
root
|-- name: string (nullable = true)
|-- matches: string (nullable = false)
由以下值组成:
inf1 -> inf1, inf2, inf3,inf1, inf2, inf3
inf2 -> inf1, inf2, inf3,inf1, inf2, inf3
inf3 -> inf3, inf1, inf4
inf4 -> inf1, inf2, inf3,inf1, inf2, inf3,inf3, inf1, inf4
inf5 -> inf3, inf1, inf4
计算匹配列中单词频率的最佳方法是什么。O/P应类似于:
inf1 -> {inf2: 2, inf3: 2}
inf2 -> ..
您可以使用
udf
计算频率
创建一个udf
as
val countFreq = udf((value: String) =>
value.split(",").map(_.trim).groupBy(identity).mapValues(_.size)
)
使用udf
withwithColumn
函数创建一个新列
val resultDF = df1.withColumn("matches", countFreq($"matches"))
resultDF.show(false)
输出:
+----+--------------------------------------------+
|name|matches |
+----+--------------------------------------------+
|inf1|[inf2 -> 2, inf1 -> 2, inf3 -> 2] |
|inf2|[inf2 -> 2, inf1 -> 2, inf3 -> 2] |
|inf3|[inf1 -> 1, inf4 -> 1, inf3 -> 1] |
|inf4|[inf2 -> 2, inf1 -> 3, inf4 -> 1, inf3 -> 3]|
|inf5|[inf1 -> 1, inf4 -> 1, inf3 -> 1] |
+----+--------------------------------------------+
最后一个模式是您得到的是映射
resultDF.printSchema()
root
|-- name: string (nullable = true)
|-- matches: map (nullable = true)
| |-- key: string
| |-- value: integer (valueContainsNull = false)
希望这有帮助 您可以使用
udf
计算频率
创建一个udf
as
val countFreq = udf((value: String) =>
value.split(",").map(_.trim).groupBy(identity).mapValues(_.size)
)
使用udf
withwithColumn
函数创建一个新列
val resultDF = df1.withColumn("matches", countFreq($"matches"))
resultDF.show(false)
输出:
+----+--------------------------------------------+
|name|matches |
+----+--------------------------------------------+
|inf1|[inf2 -> 2, inf1 -> 2, inf3 -> 2] |
|inf2|[inf2 -> 2, inf1 -> 2, inf3 -> 2] |
|inf3|[inf1 -> 1, inf4 -> 1, inf3 -> 1] |
|inf4|[inf2 -> 2, inf1 -> 3, inf4 -> 1, inf3 -> 3]|
|inf5|[inf1 -> 1, inf4 -> 1, inf3 -> 1] |
+----+--------------------------------------------+
最后一个模式是您得到的是映射
resultDF.printSchema()
root
|-- name: string (nullable = true)
|-- matches: map (nullable = true)
| |-- key: string
| |-- value: integer (valueContainsNull = false)
希望这有帮助 谢谢@Shankar。这真的很有帮助。有没有办法从dataframe中获取前N个元素(基于匹配)。是的,请确定您可以使用值进行排序并获取N个元素。如果您可以共享相同的代码,那就太好了。我对spark非常陌生。将udf更改为`val countFreq=udf((value:String)=>{`
val count=value.split(“,”).map({.trim.).groupBy(identity).mapValues({.size)
count.toSeq.sortWith({.u2>})。使用(2)
}`这一个返回前2名的anks@Shankar。这真的很有帮助。有没有办法从dataframe中获取前N个元素(基于匹配)。是的,请确定您可以使用值进行排序并获取N个元素。如果您可以共享相同的代码,那就太好了。我是spark的新手。将udf更改为`val countFreq=udf((value:String)=>{`val count=value.split(“,”).map({.trim.).groupBy(identity).mapValues({.size)
count.toSeq.sortWith({.u2>})。取(2)
}`这个返回前2名的值