Все, что вам нужно, чтобы начать создавать конвейеры данных 🪠🧑‍🔧

Джулия — естественный выбор для науки о данных и машинного обучения? Но как насчет инженерии данных? В этом посте мы рассмотрим, как вы можете использовать Julia для различных задач Data Engineering, от основ до создания конвейеров. Как вы увидите, производительность и простота использования Julia могут быть легко использованы во всем стеке ML и DS.

Далее мы рассмотрим следующие темы и узнаем, как можно использовать Julia для:

  • Чтение 🤓 и запись ✍️ файлов в Julia
  • Работа с базами данных 💽
  • Обзор других инструментов

Если вы хотите узнать, почему Джулия хорошо подходит для науки о данных, ознакомьтесь с этой статьей:



И если вам интересно, почему Джулия — это будущее машинного обучения, посмотрите:



Что такое инженерия данных? 🧐

Прежде чем мы углубимся в детали, стоит поговорить о том, что такое Data Engineering. Если вы уже знакомы с этим и хотите погрузиться в Джулию, не стесняйтесь пропустить этот раздел. На максимально возможном уровне Data Engineering — это перемещение данных из одного источника в другой. Предположим, например, что у вас есть работающий веб-сайт с несколькими серверами, каждый из которых хранит данные о продажах определенного продукта. Один из способов проверить общий объем продаж — выполнить запросы к производственным базам данных и агрегировать результаты, чтобы получить общий объем продаж. Но что, если вы хотите провести более сложный анализ?

В этом случае инженер данных может подключить все производственные базы данных к другой базе данных, которую можно использовать специально для целей анализа. До сих пор мы рассмотрели функции извлечения и загрузки в Data Engineering. Однако во многих случаях нам могут понадобиться данные в формате, отличном от того, в котором они были изначально. Возможно, вы регистрировали общее количество транзакций, но теперь хотите получить построчную стоимость элемента. Именно здесь Data Engineer будет выполнять преобразования данных, третью основную функцию Data Engineering.

Итак, с точки зрения Data Engineering, что мы на самом деле сделали в этом примере? Итак, мы определили конвейер! Чтобы пример работал, у нас был источник данных (исходные производственные серверы), где мы делали извлечение, затем дополняли/преобразовывали данные, а затем загружали их в хранилище данных (хранилище), где команда специалистов по обработке и анализу данных теперь может выполнять дальнейшие действия. анализ.

Теперь, когда у вас есть представление о том, как может выглядеть процесс проектирования данных, вам может быть более ясно, почему использование одного и того же инструмента (например, Julia) может быть выгодным для всех.

Правка: мой соавтор и я рады сообщить, что предварительные заказы на нашу новую книгу «Ускоренный курс Джулии» уже доступны:



Чтение 🤓 и запись ✍️ файлов в Julia

Одним из распространенных методов хранения данных является сохранение информации в значениях, разделенных запятыми (CSV). Давайте узнаем, как загружать, изменять и записывать данные в CSV с Джулией. Для этого мы будем использовать пакеты DataFrames.jl и CSV.jl. Начнем с добавления пакета:

(@v1.7) pkg> add DataFrames # type "]" to enter pkg mode
(@v1.7) pkg> add CSV # type "]" to enter pkg mode

Если вы никогда не использовали диспетчер пакетов в Julia и вам нужен краткий обзор, ознакомьтесь с этой статьей:



Теперь, когда у нас установлены DataFrames и CSV, мы загрузим их:

julia> using DataFrames, CSV

Затем давайте загрузим файл CSV в DataFrames.jl:

julia> df = DataFrame(CSV.File("/Users/logankilpatrick/Desktop/QS World University Rankings combined.csv"))

В этом примере мы будем играть с набором данных QS World University Rankings 2017–2022 на Kaggle, который находится в
Public Domain
. Результаты мы можем увидеть следующим образом:

Если вы хотите выбрать определенный столбец, вы можете сделать что-то вроде:

julia> df.university 
6482-element Vector{String}:
"Massachusetts Institute of Technology (MIT) "
"Stanford University"
"Harvard University"
"University of Cambridge"
⋮

Чтобы получить все имена столбцов, мы можем использовать функцию names или propertynames:

julia> names(df)
9-element Vector{String}:
"year"
"rank_display"
"university"
"score"
"link"
"country"
"city"
"region"
"logo"

И если бы мы хотели перебрать все строки одну за другой, мы бы сделали:

for row in eachrow(df)
    print(row)
end

Хорошо, теперь, когда мы знаем, как выполнять некоторые основные операции, давайте посмотрим, как мы можем изменить фрейм данных, а затем записать его обратно в файл CSV. В DFs.jl мы можем получить доступ к определенной строке, выполнив df[index, columns], поэтому в этом случае, если мы хотим получить доступ ко 2-й строке и всем столбцам, которые являются ее частью, мы должны сделать df[2, :]. Теперь создадим новую переменную:

julia> new_row = df[2, :]
julia> new_row.university = "Julia Academy"
"Julia Academy"
julia> new_row.city = "Remote"
"Remote"
julia> new_row.link = "juliaacademy.com"
"juliaacademy.com"

А затем, чтобы добавить новую строку обратно во фрейм данных, мы можем использовать функцию push!:

julia> push!(df, new_row)

Теперь у нас есть обновленный фрейм данных, мы можем записать его в CSV, выполнив:

julia> CSV.write("/Users/logankilpatrick/Desktop/QS World University Rankings combined and Edited.csv", df)

Вы можете локально подтвердить, что при этом был создан новый CSV-файл с обновленным значением в конце. Это должно научить вас работать с данными в формате CSV. Конечно, это гораздо больше, чем мы можем охватить в этом посте, но я надеюсь, что этот пример вселит в вас уверенность в том, что работать с CSV в DataFrames.jl довольно просто. Если вы хотите узнать больше, ознакомьтесь с документацией DataFrames.jl или посмотрите этот мастер-класс с JuliaCon 2021:

Работа с базами данных 💽 в Джулии

Давайте начнем этот раздел базы данных с работы с MySQL в Julia. Как и в случае с другими пакетами, чтобы добавить MySQL.jl, мы можем просто ввести ] add MySQL . Затем запустите using MySQL, чтобы загрузить пакет.

Обратите внимание, что в этом разделе предполагается, что у вас уже есть база данных MySQL, созданная на вашем компьютере и работающая. Мы можем подключиться к этой БД, выполнив:

julia> con = DBInterface.connect(MySQL.Connection, "localhost",
"root", "my_password", db = "teacher_sample")
MySQL.Connection(host="localhost", user="root", port="3306", db="teacher_sample")

В приведенном выше коде мы подключились к базе данных в месте назначения «localhost» с именем пользователя «root», паролем «my_password» и именем схемы «teacher_sample». Опять же, некоторые из этих свойств были заданы заранее, когда я создавал саму базу данных MySQL.

Чтобы правильно увидеть результаты, которые мы можем вернуть из наших команд SQL, нам также необходимо загрузить пакет DataFrames.jl через:

using DataFrames

Затем мы можем попробовать выполнить пример команды, такой как SELECT * :

julia> DataFrame(DBInterface.execute(con, "SELECT * FROM teacher_sample.teachers;"))

Это создает следующий фрейм данных:

Функция DBInterface.execute() принимает два входа:

  • Курсор, который является указателем на базу данных, с которой мы хотим работать, которую мы изначально определили
  • Команда SQL в строковом формате (как и в эквиваленте Python MySQL)

Отсюда вы можете выполнять практически любые команды SQL, которые хотите, используя одну и ту же функцию execute с разными строками SQL. Это завершает основную функциональность, которую вы получите от пакета базы данных.

Другие базы данных в Джулии

Помимо MySQL, на Джулии написано множество других привязок к базам данных. Возможно, вы захотите проверить, например, TypeDB.jl:

Или JuliaDB (чистая база данных Julia):

И многие другие! Я предлагаю проверить https://github.com/JuliaData и https://github.com/JuliaDatabases для получения полного списка всех баз данных, доступных в Julia.

Другие инструменты для обработки данных ⚒️

То, что вы используете для проектирования данных, действительно зависит от того, над чем вы работаете. Давайте кратко рассмотрим, как вы можете использовать некоторые из наиболее распространенных инструментов обработки данных в Julia:

RedShift в Джулии

Если вы хотите подключиться к AWS RedShift в Julia, вы можете использовать LibPQ.jl

BigQuery в Джулии

Доступ к BigQuery от Google можно получить через GCP.jl.

Таблица в Юлии

Хотя это не поддерживается полностью, вы можете подключиться к Tableau в Julia через расширения, как описано здесь:

Apache Spark в Джулии

Привязка Julia для Apache Spark существует в Spark.jl

Апач Кафка в Джулии

Оболочку для librdkafka можно найти в RDKafka.jl

Даск в Джулии

Хотя это и не совсем то же самое, Dagger.jl обеспечивает параллелизм, который очень вдохновлен Dask: https://github.com/JuliaParallel/Dagger.jl

Apache Hive в Джулии

Hive доступен через Hive.jl

Может ли Джулия стать будущим Data Engineering? 🧐

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

Преимущество, которое я вижу в Джулии в сфере разработки данных, заключается в стирании границ между теми, кто хочет заниматься программной инженерией, инженерией данных и наукой о данных. Сейчас, поскольку многие инструменты зависят от контекста, в этой области работает не так много людей. Но я вижу будущее, в котором «инженеры данных с полным стеком» будут работать во всех трех дисциплинах, используя Джулию в качестве единственного инструмента, который им поможет.

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

Не стесняйтесь обращаться ко мне в Твиттере, чтобы поделиться своими мыслями: https://twitter.com/OfficialLoganK