/
CryptoHoodieAvroWriteSupport.java
72 lines (63 loc) · 2.5 KB
/
CryptoHoodieAvroWriteSupport.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
* Copyright (c) 2018 Uber Technologies, Inc. (hoodie-dev-group@uber.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.uber.hoodie.avro;
import com.uber.hoodie.common.BloomFilter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.avro.Schema;
import org.apache.hadoop.conf.Configuration;
import org.apache.parquet.schema.ExtType;
import org.apache.parquet.schema.MessageType;
import org.apache.parquet.schema.Type;
import org.codehaus.jackson.JsonNode;
public class CryptoHoodieAvroWriteSupport extends HoodieAvroWriteSupport {
public CryptoHoodieAvroWriteSupport(
MessageType schema, Schema avroSchema, BloomFilter bloomFilter) {
super(schema, avroSchema, bloomFilter);
}
// TODO: Nest columns will be added later
@Override
public WriteContext init(Configuration configuration) {
WriteContext writeContext = super.init(configuration);
MessageType messageType = writeContext.getSchema();
List<Type> newFields = new ArrayList<>();
for (Type field : messageType.getFields()) {
ExtType<Object> cryptoField = new ExtType<>(field);
Schema avroSchema = super.getAvroSchema();
Map<String, Object> metadata = getMetadata(avroSchema, field);
cryptoField.setMetadata(metadata);
newFields.add(cryptoField);
}
MessageType newMessageType = new MessageType(messageType.getName(), newFields);
Map<String, String> extraMetadata = new HashMap<>();
return new WriteContext(newMessageType, extraMetadata);
}
private Map<String, Object> getMetadata(Schema avroSchema, Type field) {
Map<String, Object> newProps = new HashMap<>();
for (Schema.Field avroField : avroSchema.getFields()) {
if (field.getName().equals(avroField.name())) {
Map<String, JsonNode> props = avroField.getJsonProps();
for (String key : props.keySet()) {
newProps.put(key, props.get(key));
}
return newProps;
}
}
return newProps;
}
}