Wprowadzenie do Koalas i Databricks.

Zbigniew Pomianowski
Zbigniew Pomianowski
May 21, 2025
7 min read
Loading the Elevenlabs Text to Speech AudioNative Player...

[vc_row] [vc_column] [vc_column_text]

Najpierw pierwsze rzeczy

W nauce o danych i świecie Pythona istnieje bardzo dobrze znany pakiet pandy.

Ale... czym są pandy?

Pandy zapewniają niezbędne struktury danych, takie jak serie, ramy danych i panele, które pomagają w manipulowaniu zestawami danych i szeregami czasowymi. Wprowadzony ogromny zestaw operacji sprawia, że ta biblioteka jest bardzo potężnym narzędziem. Jest darmowa w użyciu i biblioteka open source, co czyni ją jedną z najczęściej używanych bibliotek nauk o danych na świecie. Dowiedz się, jak nasze usługi inżynierii danych może pomóc Twojej firmie

 

Architektura Pandas

 

  • pandy/rdzeń - struktury danych
  • pandy/src - podstawowa funkcjonalność zapisana w C/Cyton.
  • pandy/io - narzędzia do wprowadzania i wyjścia, plików, danych itp
  • pandy/narzędzia - kody i algorytmy dla różnych funkcji i operacji (np.: scalanie, łączenie, konkatenacja itp.)
  • pandy/rzadkie - przenosi rzadkie wersje, np. wersje stworzone do obsługi brakujących wartości różnych struktur danych
  • pandy/statystyki - funkcje związane ze statystyką, takie jak regresja liniowa
  • pandy/użyteczny - narzędzia testowe i różne inne narzędzia do debugowania biblioteki.
  • pandy/rpy - interfejs, który pomaga połączyć R. Nazywa się R2Py

 

Kluczowe cechy

 

  • manipulacja danymi
  • obsługa brakujących wartości
  • obsługa formatu pliku
  • czyszczenie danych
  • wyobrażać sobie
  • obsługa Pythona

 

 

Proste przykłady kodu

 

Pisanie plików Excel - generowanie próbki testowej

 

import numpy
import losowy
importuj pandy jako pd

writer = pd.ExcelWriter ('pandas_simple.xlsx', engine = 'openpyxl')

sample_nb = int (1e1)
df = plik PD.DataFrame (
{'wiek': np.random.random_całkowite (0, 100, sample_nb),
'sex': np.random.choice (['mężczyzna', 'kobieta'], sample_nb)})

df.to_excel (pisarz, arkusza_nazwa='arkusza1')

writer.save ()

 

Odczytywanie plików Excel

 

importuj pandy jako pd
df = pd.read_excel ('pandas_simple.xlsx', arkusza_nazwa='arkusza1')

df

Wynik:

 

Bez nazwy: 0 wiek płci
0 0 43 Kobieta
1 1 57 mężczyźni
2 2 9 kobieta
3 3 56 Kobieta
4 4 75 mężczyźni
5 5 6 kobieta
6 6 49 mężczyźni
7 7 15 mężczyźni
8 8 19 Kobieta
9 9 63 mężczyźni

 

df.sex.unikalny ()

Wynik:

 

array (['kobieta', 'męski'], dtype=obiekt)

 

df.mean ()

Wynik:

 

Bez nazwy: 0 4.5
wiek 39,2
typ d: float64

 

 

Koala

Główny zamiar tego projektować ma na celu zapewnienie naukowcom danych używającym pand sposobu skalowania istniejących obciążeń dużych zbiorów danych poprzez uruchamianie ich na Apache SparkTM bez znaczącej modyfikacji ich kodu.
The Koala projekt pozwala na wykorzystanie interfejs API pandy interfejs z big data, poprzez implementację pandy Interfejs API DataFrame na szczycie Apache Spark.
Pandas jest de facto standardową (jednowęzłową) implementacją DataFrame w Pythonie, podczas gdy Spark jest standardem przetwarzania dużych zbiorów danych.
Oznacza to, że teoretycznie praca POC napisana w pandach powinna być bardzo łatwa do migracji do środowiska iskrowego.
Możesz być natychmiast produktywny dzięki Spark, bez krzywej uczenia się, jeśli znasz już pandy.

 

  • pandy - testy, mniejsze zbiory danych
  • koale - duże rozproszone zbiory danych

Ostrzeżenie: koalas implementuje ~ 80% wszystkich interfejsów API pandy [czerwiec 2020]

koale zaleca się stosowanie z najnowszym Apache Spark 3.0+:

 

  • Python 3.8
  • Akcesoria iskrowe
  • nowe wskazówki typu
  • lepsze operacje na miejscu

Wewnętrznie, Koalas DataFrames są zbudowane na PySpark DataFrame API. Koalas tłumaczy interfejsy API pandas na logiczny plan Spark SQL, który jest następnie zoptymalizowany i wykonywany przez wyrafinowany i solidny silnik SQL Spark. Koalas wykorzystuje również leniwą semantykę oceny w celu maksymalizacji wydajności. Aby mieć zgodną strukturę pandy DataFrame i jej bogate interfejsy API, które wymagają niejawnego porządkowania, Koalas DataFrame mają wewnętrzne metadane reprezentujące indeksy równoważne pandy i etykiety kolumn mapowane do kolumn w PySpark DataFrame.

 

 

Bawmy się databrickami

Aby to utrudnić, użyjemy plików Excel:) Ktoś mądry powiedział pewnego dnia, że prawdziwe big data zawsze wiąże się z Excelem w pewnym momencie. Najlepiej byłoby mieć go na samym końcu przepływu pracy, ale życie łatwo to weryfikuje.

Koalas to biblioteka wysokiego poziomu, którą możemy zainstalować tylko po stronie sterownika. Niemniej jednak nadal potrzebujemy zainstalowanych zależności w naszych węzłach:

 

  • PySpark >= 2.4 - sterownik+węzły
  • pyarrow >= 0.10 - sterownik+węzły
  • pandy >= 0.23 - kierowca
  • matplotlib >= 3.0.0 - kierowca

Instalacja i import:

 

dButils.Library.InstallPypi („koala”)
dButils.Library.InstallPypi („openpyxl”)
dbutils.library.RestartPython ()

importuj numpy jako np
importuj pandy jako pd
importuj databricks.koalas jako ks

Teraz generujemy niektóre przykładowe dane uważane za dość ciężkie do przetworzenia na jednej maszynie. Jest to bardzo nietypowe źródło, dlatego kod nie wykorzystuje Spark moc ramy:

 

import numpy
import losowy
importuj pandy jako pd

def sample_dfs (plików_nb):
dla i w zakresie (files_nb):
sample_nb = int (1e5)
wydajność ks.DataFrame (
{'wiek': np.random.randint (0, 100, sample_nb),
'sex': np.random.choice (['mężczyzna', 'kobieta'], sample_nb)})

dla idx, df w wyliczeniu (sample_dfs (100)):
writer = pd.excelWriter ('/dbfs/pandas_simple_%03d.xlsx'% idx, engine = 'openpyxl')
df.to_excel (pisarz, arkusza_nazwa='arkusza1')
writer.save ()

Takie nieprzyjemne źródło można załadować od razu!

 

kdf = ks.read_excel ('plik: /dbfs/pandas_simple_*', engine = 'openpyxl')
kdf.to_spark () .count ()

Wynik:

 

100000000

 

kdf.count ()

Wynik:

 

Bez nazwy: 0 10000
wiek 10000
seks 10000
typ d: int64

Aby udowodnić, że koale wykorzystują Iskra możemy użyć:

 

kdf.explain (rozszerzony=prawda)

Wynik:

 

== Przeanalizowany plan logiczny ==
Projekt [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- Projekt [__index_level_0__ #32185L, bez nazwy: 0 #32186L, wiek #32187L, płeć #32188, monotonically_augmenting_id () AS __natural_order__ #32197L]
+- MapInPandas <lambda>(treść #32178), [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- Projekt [treść #32178]
+- Relacja [ścieżka #32175, czas modyfikacji #32176, długość #32177L, zawartość #32178] BinaryFile

== Analizowany plan logiczny ==
__index_level_0__: bigint, Bez nazwy: 0: bigint, wiek: bigint, płeć: string
Projekt [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- Projekt [__index_level_0__ #32185L, bez nazwy: 0 #32186L, wiek #32187L, płeć #32188, monotonically_augmenting_id () AS __natural_order__ #32197L]
+- MapInPandas <lambda>(treść #32178), [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- Projekt [treść #32178]
+- Relacja [ścieżka #32175, czas modyfikacji #32176, długość #32177L, zawartość #32178] BinaryFile

== Zoptymalizowany plan logiczny ==
MapInPandas <lambda>(treść #32178), [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- Projekt [treść #32178]
+- Relacja [ścieżka #32175, czas modyfikacji #32176, długość #32177L, zawartość #32178] BinaryFile

== Plan fizyczny ==
MapInPandas <lambda>(treść #32178), [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- FileScan BinaryFile [content #32178] Batched: false, Filters danych: [], Format: org.apache.spark.sql.execution.Datasources.binaryFile.BinaryFileFormat @128c5b73, Lokalizacja: InMemoryFileIndex [plik: /dbfs/pandas_simple_003.xlsx, plik: /dbfs/pandas_simple_009.xlsx, plik: /dbf..., PartitionFilters: [],: konstrukcja <content:binary>

Podczas oglądania DAY dla tej ramy danych możemy zaobserwować nowe rodzaje operacji w pierwszym etapie:

PlikiScan BinaryFile -> MapinPandas

 

Konfiguracja

Koala są dostarczane z zestawem opcji konfiguracyjnych, które mogą nawet przełączać typ przetwarzania między pandami a PySpark w zależności od progów. Proszę zapoznać się z dokumenty tutaj. Poszczególne opcje mogą mieć ogromny wpływ na ostateczny czas przetwarzania.

Opcje można ustawić globalnie lub dla części kodu za pomocą menedżerów kontekstu:

 

importuj databricks.koalas jako ks
z databricks.koalas.config importuj get_option, set_option, reset_option

# przykład
opt_value = get_option ('compute.max_rows')
print ('check', opt_value)
set_option ('compute.max_rows', 2000)
opt_value = get_option ('compute.max_rows')
print („po zmianie”, wartość opt_)
reset_option ('compute.max_rows')
print ('po zresetowanie', opt_value)

# lub
ks.options.compute.max_rows = 2000
drukuj (ks.options.compute.max_rows)

# opcje koalas używane tylko w następującym kontekście
z ks.option_context ('display.max_rows', 10, 'compute.max_rows', 5):
drukuj (ks.get_option ('display.max_rows'))
drukuj (ks.get_option ('compute.max_rows'))

 

Interoperacyjność między pandami i Sparkiem

Istnieje kilka sposobów korzystania z funkcji iskry w koalach danych:

 

importuj databricks.koalas jako ks

sdf = Spark.CreateDataFrame (
[(1, 23, „Marysia”),
(2, 15, „Kasia”),
(3, 17, „Wojtek”)],
schema= ['indeks', 'wiek', 'nazwa'])
sdf.show ()

# +-----+---+-------+
# |index|wiek| nazwa|
# +-----+---+-------+
# | 1| 23|Marysia |
# | 2| 15| Kasia|
# | 3| 17| Wojtek|
# +-----+---+-------+

# konwertuj spark-df na koalas-df
kdf = sdf.to_koalas ()

# konwertuj koalas-df na spark-df
sdf = kdf.to_spark ()

# akcesoria iskrowe
z pyspark.sql importuj funkcje jako F
kdf ['age_sqrt'] = kdf.age.spark.Transform (lambda col: f.sqrt (col))

kdf

# nazwa wieku indeksu age_sqrt
# 0 1 23 Marysia 4.795832
# 1 2 15 Kasia 3.872983
# 2 3 17 Wojtek 4.123106

# zastosuj
kdf.spark.apply (
lambda sdf: sdf.selectExpr ('wiek + 10 jako wiek_następny_10_lat'))

# wiek_następny_10_lat
# 0 33
# 1 25
# 2 27

Zauważ, że zastosuj z akcesorium iskrowego służy do obsługi całej ramy danych w ramach funkcji lambda. przekształcać jest używany tylko dla określonej kolumny.

 

Komentarz

Koala jest czymś jeszcze nowym. Niemniej jednak może to być bardzo przydatna biblioteka, zwłaszcza gdy praca z projektem POC opartym na pandach wymaga szybkiej migracji do pełnego środowiska dużych zbiorów danych, ponieważ Spark wykorzystuje znacznie większą skalę.

Odwiedź nasz blog, aby uzyskać bardziej szczegółowe artykuły dotyczące inżynierii danych:

[/vc_column_text] [/vc_column] [/vc_row] [vc_row] [vc_column] [vc_single_image image="6559" img_size="pełny” onclick="custom_link” link=” https://dsstream.com/services/data-engineering/"][/vc_column][/vc_row]

Share this post
Data Engineering
Zbigniew Pomianowski
MORE POSTS BY THIS AUTHOR
Zbigniew Pomianowski

Curious how we can support your business?

TALK TO US