Вопрос по – Динамически генерировать case-класс в Scala

2

Я хочу прочитать довольно большой CSV-файл и обработать его (ломтик, игральные кости, суммирование и т. Д.)interactively (разведка данных). Моя идея - прочитать файл в базу данных (H2) и использовать SQL для его обработки:

Read the file: I use Ostermiller csv parser

Determine the type of each column: I select randomly 50 rows and derive the type (int, long, double, date, string) of each column

I want to use Squeryl to process. To do so I need to create a case class dynamically. That's the bottleneck so far!

I upload the file to H2 and use any SQL command.

Мои вопросы:

Is there a better general interactive way of doing this in Scala? Is there a way to solve the 3rd point? To state it differently, given a list of types (corresponding to the columns in the csv file), is it possible to dynamically create a case class corresponding to the table in Squeryl? To my understanding I can do that using macros, but I do not have enough exposure to do that.
Вы думали об использовании чего-то еще, кроме Scala? подобноGnu R? ziggystar
Вот вопрос, связанный с большим количеством вопросов, с хорошо поставленным ответом:dynamically creating case classes with macros Mike Biglan
@ziggystar Я широко использую R для повседневной работы. Это определенно выполнимо в R! Я пытаюсь исследовать Scala для анализа данных ... teucer

Ваш Ответ

3   ответа
3

Относительно вашего второго вопроса - в дополнение к ответу дрексина - можно сгенерировать байт-код с помощью такой библиотеки, какКАК М, С такой библиотекой вы можете генерировать тот же байт-код, что и класс case.

2

нет способа динамически создавать классы, кроме рефлексии, которая медленная и опасная, и поэтому ее следует избегать. Даже с макросами вы не можете сделать это. Макросы оцениваются во время компиляции, а не во время выполнения, поэтому вам нужно знать структуру ваших данных во время компиляции. Для чего вам нужны классы дел, если вы даже не знаете, как выглядят ваши данные? Какую выгоду вы ожидаете от использованияMap[String,Any]?

память (файл может быть очень большим), производительность (?), использование базы знаний SQL и т. д. teucer
1

что вы хотите создать запечатанный базовый класс, а затем серию классов case в качестве его подклассов. Каждый подкласс будет обертывать свой тип, который вы поддерживаете.

Затем вы можете использовать операторы сопоставления и деконструкцию для работы с отдельными типами и обрабатывать их в общем через базовый класс в тех местах, где это не имеет значения.

Вы не можете создать класс для всей строки, так как вы недостаточно знаете об этом во время компиляции. Даже если бы вы могли динамически генерировать класс (возможно, вызывая компилятор во время выполнения), вы не смогли бы извлечь выгоду из безопасности типов, и большая часть вашего кода в любом случае должна была бы обрабатывать его в общем.

Похожие вопросы