我有一个要使用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吗?
答案 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
中定义的全部函数的污染。