在groupByKey或groupBy之后形成列列表

问题描述 投票:0回答:1

我有这个输入数据框

输入_df:

C1 C2 C3
A 1 2012年6月12日
A 2 2012年6月13日
B 3 2012年6月12日
B 4 2012年6月17日
C 5 2012年6月14日

在转换之后,我想获得这种按 C1 分组的 DataFrame 并创建 C4 列,该列由来自 C2 和 C3 的一对列表组成

输出_df:

C1 C4
A (1, 12/06/2012), (2, 12/06/2012)
B (3, 12/06/2012), (4, 12/06/2012)
C (5, 12/06/2012)

当我尝试这个时,我接近结果:

val output_df = input_df.map(x => (x(0), (x(1), x(2))) ).groupByKey()

我得到这个结果

(A,CompactBuffer((1, 12/06/2012), (2, 13/06/2012)))    
(B,CompactBuffer((3, 12/06/2012), (4, 17/06/2012)))   
(C,CompactBuffer((5, 14/06/2012)))

但我不知道如何将其转换为 DataFrame 以及这是否是最好的方法。
即使采用其他方法,也欢迎任何建议

scala apache-spark group-by
1个回答
1
投票

//请尝试这个

val conf = new SparkConf().setAppName("groupBy").setMaster("local[*]")
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._

val rdd = sc.parallelize(
  Seq(("A",1,"12/06/2012"),("A",2,"13/06/2012"),("B",3,"12/06/2012"),("B",4,"17/06/2012"),("C",5,"14/06/2012")) )

val v1 = rdd.map(x => (x._1, x ))
val v2 = v1.groupByKey()
val v3 = v2.mapValues(v => v.toArray)

val df2 = v3.toDF("aKey","theValues")
df2.printSchema()

val first = df2.first
println (first)

println (first.getString(0))

val values = first.getSeq[Row](1)

val firstArray = values(0)

println (firstArray.getString(0)) //B
println (firstArray.getInt(1)) //3
println (firstArray.getString(2)) //12/06/2012
© www.soinside.com 2019 - 2024. All rights reserved.