У меня есть файлы Parquet, написанные на Python с использованием PyArrow. Теперь я хочу прочитать их с помощью программы Java. Я пробовал следующее, используя Apache Avro:
import java.io.IOException;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.Schema;
import org.apache.avro.SchemaBuilder;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.parquet.avro.AvroParquetReader;
import org.apache.parquet.avro.AvroReadSupport;
import org.apache.parquet.hadoop.ParquetReader;
public class Main {
private static Path path = new Path("D:\\pathToFile\\review.parquet");
public static void main(String[] args) throws IllegalArgumentException {
try {
Configuration conf = new Configuration();
Schema schema = SchemaBuilder.record("lineitem")
.fields()
.name("reviewID")
.aliases("review_id$str")
.type().stringType()
.noDefault()
.endRecord();
conf.set(AvroReadSupport.AVRO_REQUESTED_PROJECTION, schema.toString());
ParquetReader<GenericRecord> reader = AvroParquetReader.<GenericRecord>builder(path)
.withConf(conf)
.build();
GenericRecord r;
while (null != (r = reader.read())) {
r.getSchema().getField("reviewID").addAlias("review_id$str");
Object review_id = r.get("review_id$str");
String review_id_str = review_id != null ? ("'" + review_id.toString() + "'") : "-";
System.out.println("review_id: " + review_id_str);
}
} catch (IOException e) {
System.out.println("Error reading parquet file.");
e.printStackTrace();
}
}
}
My Parquet File содержит столбцы, имена которых содержат символы [
, ]
, .
, \
и $
. (В этом случае файл Parquet содержит столбец review_id$str
, значения которого я хочу прочитать). Однако эти символы недопустимы в Avro (см .: https://avro.apache.org/docs/current/spec.html#names). Поэтому я попытался использовать Псевдонимы (см .: http://avro.apache.org/docs/current/spec.html#Aliases). Несмотря на то, что теперь я не получаю никаких «Ошибок недопустимого символа», я все еще не могу получить значения, т.е. ничего не печатается, даже если столбец содержит значения.
Он печатает только:
review_id: -
review_id: -
review_id: -
review_id: -
...
Ожидается, что будет:
review_id: Q1sbwvVQXV2734tPgoKj4Q
review_id: GJXCdrto3ASJOqKeVWPi6Q
review_id: 2TzJjDVDEuAW6MR5Vuc1ug
review_id: yi0R0Ugj_xUx_Nek0-_Qig
...
Я неправильно использую псевдонимы? Можно ли вообще использовать псевдонимы в этой ситуации? Если да, объясните, пожалуйста, как я могу это исправить. Спасибо.