数据集上的筛选操作失败,并显示常见错误“ AnalysisException:无法解析给定的输入列”

时间:2019-07-18 12:14:45

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

我正在使用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类进行操作的操作。这是有效的理解吗?

谢谢!

0 个答案:

没有答案