我正在使用Kafka 2.3.0和Spark 2.3.4。我正在尝试通过在其上运行过滤器来对它进行操作。但是,我得到了分析异常错误,无法计算出解决方案。请注意,上面的POJO数据集本身很好,并且可以在控制台上很好地打印。 该代码是this的延续。请注意,POJO数据集由通过Kafka传入的流数据制成。
查看列名以查找不匹配项(如有),并尝试使用lambda和sql来尝试过滤器语句的变体。我认为我缺少在理解上才能正常工作的东西。
这是POJO类:
public class Pojoclass2 implements Serializable {
private java.sql.Date dt;
private String ct;
private String r;
private String b;
private String s;
private Integer iid;
private String iname;
private Integer icatid;
private String cat;
private Integer rvee;
private Integer icee;
private Integer opcode;
private String optype;
private String opname;
public Pojoclass2 (){}
...
//getters and setters
}
//What works (dataAsSchema2 is a Dataset<Row> formed out of incoming streaming data of a kafka topic):
Encoder<Pojoclass2> encoder = Encoders.bean(Pojoclass2.class);
Dataset<Pojoclass2> se= new Dataset<Pojoclass2>(sparkSession,
dataAsSchema2.logicalPlan(), encoder);
//I can print se on a console sink and it is all good. I can do all filtering on se but can only receive the return value as Dataset<Row>.
//What doesnt work(it compiles but throws the analysis exception at runtime:
Dataset<Pojoclass2> h = se
.filter((FilterFunction<Pojoclass2>) s -> s.getBuyerName() == "ASD");
//or
Dataset<Pojoclass2> h = se
.filter((FilterFunction<Pojoclass2>) s -> s.getBuyerName() == "ASD").as(Encoders.bean(Pojoclass2.class));
和错误跟踪(请注意,这是实际的。在Pojoclass2中,我更改了属性名称以保护机密性。名称可能会有所不同,类型匹配):
"
Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '`contactRole`' given input columns: [iname, ct, icatid, s, r, b, opname, cat, opcode, dt, iid, icee, optype, rvee];;
'TypedFilter ibs.someengine.spark.somecore.SomeMain$$Lambda$17/902556500@23f8036d,
...
...
"
我希望过滤器可以正常运行,并且h应该包含过滤后的强类型行。
目前,我正在通过将其转换为DataFrame(Dataset<Row>
)进行工作,但是这种方式无法达到目的(我想)。
我还注意到,似乎不支持对强类型数据集进行允许通过Bean类进行操作的操作。这是有效的理解吗?
谢谢!