Spark Scala DF。在处理同一列的某些行时,向DF添加新列

时间:2016-05-08 18:27:11

标签: scala apache-spark dataframe calculated-columns udf

逗人, 我是SparK Scala的新手,并且, 我有一个两列的DF:“UG”和“Counts”,我喜欢获得第三列 如何在这个列表中公开。

DF:UG,Counts,CUG(列)

  • of 12 4
  • of 23 4
  • 134 3
  • 爱68 2
  • pain 3 1
  • 18 3
  • 爱100 2
  • of 23 4
  • 12 3
  • of 11 4

我需要添加一个名为“CUG”的新列,第三个是暴露的,其中CUG(i)是UG中字符串(i)出现在整个列中的次数。

我尝试了以下方案:

将DF与df中的上一个表格相同。我做了一个sql UDF函数来计算字符串出现在“UG”列中的次数,即:

val NW1 = (w1:String) => { 
  df.filter($"UG".like(w1.substring(1,(w1.length-1))).count() 
}:Long
val sqlfunc = udf(NW1)
val df2= df.withColumn("CUG",sqlfunc(col("UG")))

但是当我尝试时,...... 它没有工作。我获得了Null Point异常的错误。 UDF计划是孤立的,但在DF中没有。 如何使用DF获取询问结果。

先谢谢。 JM3

1 个答案:

答案 0 :(得分:0)

所以你可以做的是首先计算按UG列分组的行数,它给出你需要的第三列,然后加入原始数据帧。如果需要,可以使用withColumnRenamed函数重命名列名称。

scala> import org.apache.spark.sql.functions._

scala> myDf.show()
+----+------+
|  UG|Counts|
+----+------+
|  of|    12|
|  of|    23|
| the|   134|
|love|    68|
|pain|     3|
| the|    18|
|love|   100|
|  of|    23|
| the|    12|
|  of|    11|
+----+------+     


scala> myDf.join(myDf.groupBy("UG").count().withColumnRenamed("count", "CUG"), "UG").show()
+----+------+---+
|  UG|Counts|CUG|
+----+------+---+
|  of|    12|  4|
|  of|    23|  4|
| the|   134|  3|
|love|    68|  2|
|pain|     3|  1|
| the|    18|  3|
|love|   100|  2|
|  of|    23|  4|
| the|    12|  3|
|  of|    11|  4|
+----+------+---+