java 对象编码,如何为自定义Java对象创建编码器?

本文介绍如何在 Apache Spark 中正确地使用 JavaBean 类进行编码,包括实现 Serializable 接口、提供无参构造函数及 getter 和 setter 方法。通过一个具体示例展示了如何创建带有内部类的 JavaBean,并使用 Spark 的 Encoder 创建 Dataset。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在使用以下类从Spark编码器创建bean

Class OuterClass implements Serializable {

int id;

ArrayList listofInner;

public int getId() {

return id;

}

public void setId (int num) {

this.id = num;

}

public ArrayList getListofInner() {

return listofInner;

}

public void setListofInner(ArrayList list) {

this.listofInner = list;

}

}

public static class InnerClass implements Serializable {

String streetno;

public void setStreetno(String streetno) {

this.streetno= streetno;

}

public String getStreetno() {

return streetno;

}

}

Encoder outerClassEncoder = Encoders.bean(OuterClass.class);

Dataset ds = spark.createDataset(Collections.singeltonList(outerclassList), outerClassEncoder)

我收到以下错误

Exception in thread "main" java.lang.UnsupportedOperationException: Cannot infer type for class OuterClass$InnerClass because it is not bean-compliant

如何在java中为spark实现这种类型的用例?如果我删除内部类,这工作正常.但我需要为我的用例设一个内部类.

解决方法:

您的JavaBean类应该有一个公共的无参数构造函数,getter和setter,它应该实现Serializable接口. Spark SQL适用于有效的JavaBean类.

编辑:添加内部类的工作示例

OuterInnerDF.java

package com.abaghel.examples;

import java.util.ArrayList;

import java.util.Collections;

import org.apache.spark.sql.Dataset;

import org.apache.spark.sql.Encoder;

import org.apache.spark.sql.Encoders;

import org.apache.spark.sql.SparkSession;

import com.abaghel.examples.OuterClass.InnerClass;

public class OuterInnerDF {

public static void main(String[] args) {

SparkSession spark = SparkSession

.builder()

.appName("OuterInnerDF")

.config("spark.sql.warehouse.dir", "/file:C:/temp")

.master("local[2]")

.getOrCreate();

System.out.println("====> Create DataFrame");

//Outer

OuterClass us = new OuterClass();

us.setId(111);

//Inner

OuterClass.InnerClass ic = new OuterClass.InnerClass();

ic.setStreetno("My Street");

//list

ArrayList ar = new ArrayList();

ar.add(ic);

us.setListofInner(ar);

//DF

Encoder outerClassEncoder = Encoders.bean(OuterClass.class);

Dataset ds = spark.createDataset(Collections.singletonList(us), outerClassEncoder);

ds.show();

}

}

OuterClass.java

package com.abaghel.examples;

import java.io.Serializable;

import java.util.ArrayList;

public class OuterClass implements Serializable {

int id;

ArrayList listofInner;

public int getId() {

return id;

}

public void setId(int num) {

this.id = num;

}

public ArrayList getListofInner() {

return listofInner;

}

public void setListofInner(ArrayList list) {

this.listofInner = list;

}

public static class InnerClass implements Serializable {

String streetno;

public void setStreetno(String streetno) {

this.streetno = streetno;

}

public String getStreetno() {

return streetno;

}

}

}

控制台输出

====> Create DataFrame

16/08/28 18:02:55 INFO CodeGenerator: Code generated in 32.516369 ms

+---+-------------+

| id| listofInner|

+---+-------------+

|111|[[My Street]]|

+---+-------------+

标签:java,apache-spark,apache-spark-2-0,spark-java

来源: https://codeday.me/bug/20190519/1134587.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值