В Python вы можете сделать следующее:
Код: Выделить всё
duckdb.read_csv(inputFile, max_line_size=10000000, null_padding=True, delimiter=";")
.write_parquet(outputFile)
Код: Выделить всё
PreparedStatement statement = conn.prepareStatement(String.format("""
PRAGMA memory_limit='16GB';
CREATE TABLE "%s" AS
SELECT * FROM read_csv("%s", delim=';');
COPY "%s" TO "%s" (FORMAT parquet);
""",
path.getFileName(),
path.toAbsolutePath(),
path.getFileName(),
outputdir.getAbsolutePath() + "/" + path.getFileName().toString().replace(".csv",".parquet")
));
statement.execute();
Обычно я ожидаю, что смогу выполнить такой оператор:
Код: Выделить всё
COPY read_csv("INPUTFILE", delim=';') TO "OUTPUTFILE" (FORMAT parquet);
В своих тестах я конвертирую около 35 гигабайт, состоящих из 25 000 CSV-файлов, так как это, по сути, то, что будет использоваться в реальном мире.
Это приводит к тому, что программа работает намного медленнее при использовании Java:
Java:
Общее время 528,120 (с)
Среднее время 20912133 (нс)
по сравнению с
Python:
Общее время: 375,7097873687744 (с)
Среднее время: 14896365.527604684 (ns)
Кто-нибудь знает, как мне лучше подойти к этому? Или это недостаток синтаксиса DuckDB?
Подробнее здесь: https://stackoverflow.com/questions/798 ... db-in-java
Мобильная версия