首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在apache光束中生成json数据和sava作为地板

如何在apache光束中生成json数据和sava作为地板
EN

Stack Overflow用户
提问于 2020-09-08 12:16:54
回答 1查看 269关注 0票数 0

这是一个困扰我两天的问题。

我可以从本地读取json数据,但是当我把它写成拼板时会出错.

我的代码如下:

代码语言:javascript
运行
复制
public class parquet_save_convert {

private static final Schema SCHEMA = new Schema.Parser().parse(
        "{ \n" +
                " \"namespace\": \"com.navteq.avro\", \n" +
                " \"name\": \"FacebookUser\", \n" +
                " \"type\": \"record\",\n" +
                " \"fields\": [\n" +
                " {\"name\": \"event_level\", \"type\": \"string\"},\n" +
                " {\"name\": \"spm_page\", \"type\": \"string\"},\n" +
                " {\"name\": \"spm_module\", \"type\": \"string\"} ]\n" +
                "}");


public static void main(String[] args) {
    Gson gson=new  GsonBuilder().create();
    String outputPath = "./output/parquet";
    PipelineOptions options = PipelineOptionsFactory.create();
    Pipeline pipeline = Pipeline.create(options);
    pipeline.apply(TextIO.read().from("./input/event_type.json"))
            .apply(ParDo.of(new DoFn<String,GenericRecord>(){
                @ProcessElement
                public void processElement(ProcessContext c){
                    HashMap<String,String> map= gson.fromJson(c.element().toString(),HashMap.class);

                    GenericRecord osRecord = new GenericData.Record(SCHEMA);

                    map.forEach((k,v)->{
                        osRecord.put(k,v);
                    });

                    c.output(osRecord);
                }
            }))
            .setCoder(AvroCoder.of(GenericRecord.class,SCHEMA))
            .apply(FileIO.<GenericRecord>write()
                    .via(ParquetIO.sink(SCHEMA)).to(outputPath)
                    .withSuffix(".parquet"));
    pipeline.run().waitUntilFinish();}

我输入的数据如下:

代码语言:javascript
运行
复制
{"event_level":"item","spm_page":"Activity","spm_module":"click"}
{"event_level":"page","spm_page":"Activity","spm_module":"action"}
{"event_level":"page","spm_page":"Activity","spm_module":"click"}
{"event_level":"item","spm_page":"Activity","spm_module":"action"}

例外是:

代码语言:javascript
运行
复制
Exception in thread "main" java.lang.IllegalArgumentException: unable to serialize DoFnWithExecutionInformation{doFn=parquet_save_convert$1@5d10455d, mainOutputTag=Tag<output>, sideInputMapping={}, schemaInformation=DoFnSchemaInformation{elementConverters=[]}}

我也谷歌这个问题,但没有得到一个答案,它使我感到非常沮丧。

通过Apache使用ParquetIO读写拼花文件的示例

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-09-10 22:16:55

我猜您的Gson对象是不可序列化的。解决方案可能是将其初始化为DoFn的SetUp方法中的局部变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63793745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档