为什么在scala中flatten和collect_list错误?与无法解析符号

时间:2019-02-21 02:58:06

标签: scala apache-spark

我有一个要使用Scala展平的数据集。

+---------+-----------+--------+
|visitorId|trackingIds|emailIds|
+---------+-----------+--------+
|     a   |       666b|      12|
|     7   |       c0b5|      45|
|     7   |       c0b4|      87|
|     a   |  666b,7p88|        |
+---------+-----------+--------+

我正在尝试实现按visitorID分组的数据框。下面是格式

+---------+---------------------+--------+
|visitorId|   trackingIds       |emailIds|
+---------+---------------------+--------+
|     a   |       666b,666b,7p88|   12,87|
|     7   |       c0b4,c0b5     |      45|       
+---------+---------------------+--------+

我的代码:

object flatten_data{


  def main(args: Array[String]): Unit = {

    val spark = SparkSession
      .builder()
      .master("local[5]")
      .appName("Flatten_DF")
      .enableHiveSupport()
      .getOrCreate()

       val df =  spark.read.format("csv")
      .option("header","true")
      .option("delimiter",",")
      .load("/home/cloudera/Desktop/data.txt")
    print(df.show())
    val flattened = df.groupBy("visitorID").agg(collect_list("trackingIds"))
  }
}

我正在使用IntelliJ Idea,并且在“ collect_list”处出现错误。 我通读了许多关于stackoverflow的解决方案,其中人们询问如何展平和groupbykey并使用了相同的collect_list。我不确定为什么这对我不起作用。是因为IntelliJ吗?

2 个答案:

答案 0 :(得分:1)

我对您的代码进行了重新处理,这似乎可行:

import org.apache.spark.sql.SparkSession
   import org.apache.spark.sql.functions._

   object flatten_data{

   def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder().master("local").appName("test").getOrCreate()
    import spark.implicits._
    val someDF = Seq(
      ("a", "666b",12),
      ("7", "c0b5",45),
      ("7", "666b,7p88",10)
    ).toDF("visitorId","trackingIds","emailIds")


    someDF.groupBy("visitorID").agg(collect_list("trackingIds")).show()
        }
    }

答案 1 :(得分:0)

collect_list是在org.apache.spark.sql.functions对象中定义的方法,因此您需要导入它:

import org.apache.spark.sql.functions.collect_list

或者,您可以导入整个对象,然后也可以从那里使用其他功能:

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

最后,我个人更喜欢将functions导入为f,并使用合格的调用:

import org.apache.spark.sql.{functions => f}

agg(f.collect_list(...))

这样,文件内部的全局名称空间不会受到functions中定义的全部函数的污染。