Есть ли способ напрямую преобразовать CSV в Parquet с помощью DuckDB на Java?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Есть ли способ напрямую преобразовать CSV в Parquet с помощью DuckDB на Java?

Сообщение Anonymous »

Я провожу несколько тестов, сравнивая использование DuckDB на разных языках и т. д., и заметил кое-что странное.
В Python вы можете сделать следующее:

Код: Выделить всё

duckdb.read_csv(inputFile, max_line_size=10000000, null_padding=True, delimiter=";")
.write_parquet(outputFile)
Однако этот синтаксис недоступен в Java, где вам придется сделать следующее:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»