java - 如何使用 org.apache.parquet.hadoop.ParquetWriter 将 NULL 值写入镶木地板?
问题描述
我有一个工具,它使用org.apache.parquet.hadoop.ParquetWriter将 CSV 数据文件转换为 parquet 数据文件。
我可以很好地编写基本的原始类型(INT32、DOUBLE、BINARY 字符串)。
我需要写 NULL 值,但我不知道怎么写。我试过null
用 ParquetWriter 简单地写,它会抛出一个异常。
如何使用org.apache.parquet.hadoop.ParquetWriter写入 NULL ?有可以为空的类型吗?
我认为代码是不言自明的:
ArrayList<Type> fields = new ArrayList<>();
fields.add(new PrimitiveType(Type.Repetition.OPTIONAL, PrimitiveTypeName.INT32, "int32_col", null));
fields.add(new PrimitiveType(Type.Repetition.OPTIONAL, PrimitiveTypeName.DOUBLE, "double_col", null));
fields.add(new PrimitiveType(Type.Repetition.OPTIONAL, PrimitiveTypeName.BINARY, "string_col", null));
MessageType schema = new MessageType("input", fields);
Configuration configuration = new Configuration();
configuration.setQuietMode(true);
GroupWriteSupport.setSchema(schema, configuration);
SimpleGroupFactory f = new SimpleGroupFactory(schema);
ParquetWriter<Group> writer = new ParquetWriter<Group>(
new Path("output.parquet"),
new GroupWriteSupport(),
CompressionCodecName.SNAPPY,
ParquetWriter.DEFAULT_BLOCK_SIZE,
ParquetWriter.DEFAULT_PAGE_SIZE,
1048576,
true,
false,
ParquetProperties.WriterVersion.PARQUET_1_0,
configuration
);
// create row 1 with defined values
Group group1 = f.newGroup();
Integer int1 = 100;
Double double1 = 0.5;
String string1 = "string-value";
group1.add(0, int1);
group1.add(1, double1);
group1.add(2, string1);
writer.write(group1);
// create row 2 with NULL values -- does not work!
Group group2 = f.newGroup();
Integer int2 = null;
Double double2 = null;
String string2 = null;
group2.add(0, int2); // <-- throws NullPointerException
group2.add(1, double2); // <-- throws NullPointerException
group2.add(2, string2); // <-- throws NullPointerException
writer.write(group2);
writer.close();
解决方案
解决方案结果很简单,只是不要写一个值:
// create row 1 with defined values
Group group1 = f.newGroup();
Integer int1 = 100;
Double double1 = 0.5;
String string1 = "string-value";
group1.add(0, int1);
group1.add(1, double1);
group1.add(2, string1);
writer.write(group1);
// create row 2 with NULL values -- does not work!
Group group2 = f.newGroup();
// do nothing !
writer.write(group2);
// Now, parquet file will have 2 rows, one with values, one with null values
推荐阅读
- c - winsock2:RAW SOCKET recvfrom() 返回错误 10022(无效参数)
- swift - 使用 NSBezierPath、CAShapeLayer 和 CAGradientLayer 绘制一条带渐变的线
- python - 解决四和问题的时间复杂度?
- jquery - 为什么使用带有 Angular/TypeScript 的 floatThead 会产生错误 Property 'floatThead' does not exist on type 'JQuery
' - android - 将 SearchView 与自定义 searchSuggestAuthority 一起使用时来自系统的不需要的建议
- flutter - flutter [在初始化程序中只能访问静态成员]
- java - 如果我不同步方法,后台发生了什么导致应用程序运行而控制台不打印任何内容?
- c++ - 通过 SSH 的 SDL2 按键
- mongodb - 如何创建一个 mongo db 包
- python - 如果我的目标答案位于行而不是列中,如何为监督学习实施训练数据?