【发布时间】:2019-08-23 12:45:55
【问题描述】:
我有一个具有此架构的数据框:
|-- Agreement_A1: string (nullable = true)
|-- Line_A1: string (nullable = true)
|-- Line_A2: string (nullable = true)
我用这段代码创建了一个新的数据框:
val df2 = df.map(row => new MapResultRequestLine().apply(row))(Encoders.bean(classOf[AgreementLine]))
函数 apply() 是这样的:
public AgreementLine apply(Row row) {
AgreementLine agrLine = new AgreementLine();
agrLine.Agreement_A1 = row.getAs("Agreement_A1");
Line res = new Line();
res.Line_A1 = row.getAs("Line_A1");
res.Line_A2 = row.getAs("Line_A2");
agrLine.line = res
return agrLine;
}
类协议线如下所示:
public class AgreementLine{
public String agreementCrocCode;
public Line line;
}
类行是这样的:
public class Line{
public String Line_A1;
public String Line_A2;
}
如何对 df2 进行分组,使结果数据框有 Agreement_A1 列和 Line 列表?
我试过这样:
val groupedDF = df2.groupBy($"Agreement_A1").agg(collect_set((array($"line"))).as("lines"))
但它显示错误“无法解析'Agreement_A1'给定输入列:[];”
【问题讨论】:
-
df2 是
AgreementLine类型的数据集,该类中没有Agreement_A1。您尝试在 df2 中不存在的列 (Agreement_A1) 上groupBy。您可以使用df2.printSchema检查数据集的架构 -
printSchema 仅显示空括号“()”。虽然 Count() 显示有行
标签: scala apache-spark apache-spark-sql apache-spark-dataset