从SQL查询返回的`dataframe / Dataset`函数中获取相同的结果

时间:2016-08-19 23:36:03

标签: apache-spark apache-spark-sql apache-spark-dataset

数据:

1,Coke
1,Beans
1,paper
2,Beans
2,Pen
2,Sheets
2,Banana

预期输出

+---+------------------------+
|  1|Coke,Beans,Paper        | 
|  2|Beans,Pen,Sheets,Banana |
+---+------------------------+

我能够通过编写SQL查询来实现这一目的。

val df = sparkSession.read.csv("file_location")
df.registerTempTable("data")

val result = sparkSession
             .sql("select _c0   ,concat_ws(',', collect_list(_c1)) as product from data group by _c0")

result.show

请使用dataframe/Dataset函数(select,groupby,agg等)帮助我实现相同的结果。

1 个答案:

答案 0 :(得分:1)

这很简单,你有答案,但我希望我不只是做一些研究生的作业。 DataFrame类似于 SQL 表,因此您可以使用其方法进行查询。

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

val df = sc.parallelize(List(
  (1, "Coke"),
  (1, "Beans"),
  (1,"paper"),
  (2,"Beans"),
  (2,"Pen"),
  (2,"Sheets"),
  (2,"Banana")
)).toDF("id", "product_name")

df.groupBy("id").agg(concat_ws(",", collect_list("product_name")).as("product_list")).show()

输出结果为:

+---+-----------------------+
|id |product_list           |
+---+-----------------------+
|1  |Coke,Beans,paper       |
|2  |Beans,Pen,Sheets,Banana|
+---+-----------------------+