Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark中数据帧列中值的计数频率_Apache Spark_Dataframe_Apache Spark Sql - Fatal编程技术网

Apache 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,

我有一个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, 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
with
withColumn
函数创建一个新列

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
with
withColumn
函数创建一个新列

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名的值