Using the alexmerced/datanotebook Docker Image

How to use the alexmerced/datanotebook Docker image for quick Python data work: bundled libraries, saving your work, and connecting to Spark and MinIO.

02 Mins readAlex Merced
Using the alexmerced/datanotebook Docker Image

Sometimes, you want to spin up a quick data notebook environment when doing quick data work or practice. For this purpose, I’ve built the alexerced/datanotebook docker image, and this blog explains how you can use it for work you’d like to do. The most significant difference between this image and the alexmerced/spark35notebook image is that while the image does have pySpark installed, it does not have Spark running within the same container. You don’t have to worry about a token to access the notebook with this image (I’ll probably do the same with my next spark image whenever I build it).

Cross-posted. This article’s canonical home is Alex Merced’s Lakehouse Blog.

To use it just navigate to empty folder on your computer in your terminal and run the following command:

docker run -p 8888:8888 -v $(pwd):/home/pydata/work -name my_notebook alexmerced/datanotebook

This will map the home directory in the container to your current directory for file persistence. Then, you’ll be able to go to localhost:8888 and start creating notebooks. Here is an example script you can try out.

# Import the Polars library
import polars as pl

# Create a sample DataFrame
data = {
 "id": [1, 2, 3, 4, 5], "name": ["Alice", "Bob", "Charlie", "David", "Eve"], "age": [25, 30, 35, 40, 45], "city": ["New York", "Los Angeles", "Chicago", "Houston", "Phoenix"]
}

# Convert the dictionary to a Polars DataFrame
df = pl.DataFrame(data)

# Display the DataFrame
print("DataFrame:")
print(df)

# Define the output file path
output_file = "output_data.parquet"

# Write the DataFrame to a Parquet file
df.write_parquet(output_file)

# Confirm the file was written
print(f"\nDataFrame successfully written to {output_file}")

Libraries Provided

Libraries you’ll have available out of the box:

  • Data manipulation: pandas, numpy, polars, dask, ibis
  • Machine learning: scikit-learn, tensorflow, torch, xgboost, lightgbm
  • Visualization: matplotlib, seaborn, plotly
  • Database access: psycopg2-binary, mysqlclient, sqlalchemy, duckdb, pyarrow
  • Object storage: boto3, s3fs, minio
  • Other utilities: openpyxl, requests, beautifulsoup4, lxml, pyspark, dremio-simple-query

If you want to install additional libraries you can use the following syntax.

# Install Polars and any other necessary libraries
!pip install polars

Connecting to Remote Spark Servers

pySpark is installed so you can write and run pySpark code but against external Spark servers, so how would you configure that Spark session would look something like this:

from pyspark.sql import SparkSession

# MinIO configurations
minio_endpoint = "http://minio-server:9000" # Replace with your MinIO server URL
access_key = "your-access-key"
secret_key = "your-secret-key"
bucket_name = "your-bucket"
minio_path = f"s3a://{bucket_name}/output_data.parquet"

# Configure the SparkSession to connect to a remote Spark server and MinIO
spark = SparkSession.builder \
 .appName("MinIOConnection") \
 .master("spark://remote-spark-server:7077") \ # Replace with your Spark master URL
 .config("spark.driver.memory", "2g") \
 .config("spark.executor.memory", "4g") \
 .config("spark.hadoop.fs.s3a.endpoint", minio_endpoint) \
 .config("spark.hadoop.fs.s3a.access.key", access_key) \
 .config("spark.hadoop.fs.s3a.secret.key", secret_key) \
 .config("spark.hadoop.fs.s3a.path.style.access", "true") \
 .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \
 .config("spark.hadoop.fs.s3a.connection.ssl.enabled", "false") \
 .getOrCreate()

# Confirm the connection by printing the Spark configuration
print("Spark session connected to:", spark.sparkContext.master)
print("MinIO path:", minio_path)

# Example DataFrame creation
data = [
 (1, "Alice", 25), (2, "Bob", 30), (3, "Charlie", 35)
]
columns = ["id", "name", "age"]

df = spark.createDataFrame(data, columns)

# Show the DataFrame
df.show()

# Perform some operations (e.g., filtering)
filtered_df = df.filter(df.age > 28)
filtered_df.show()

# Write the DataFrame to MinIO as a Parquet file
filtered_df.write.parquet(minio_path)

# Optionally, read the Parquet file back from MinIO
read_df = spark.read.parquet(minio_path)
read_df.show()

# Stop the Spark session
spark.stop()

Conclusion

Hope you find this docker image a functional flywheel for ad-hoc data engineering and data analytics work!

Share :

Related Posts

What Apache Polaris 1.9.0 Brings to Low-Egress Multi-Cloud Catalogs

What Apache Polaris 1.9.0 Brings to Low-Egress Multi-Cloud Catalogs

Picture a lakehouse that stores Iceberg tables in three places. Raw event data sits in Amazon S3 because that is where the producers live. A finance team keeps its modeled reporting tables in Azure. A...

Schema Pruning and Few-Shot SQL Selection for Data Agents Facing Thousands of Columns

Schema Pruning and Few-Shot SQL Selection for Data Agents Facing Thousands of Columns

A data agent works fine in the demo. The demo database has six tables and forty columns, and the agent writes correct SQL for nearly every question. Then the team points it at the real lakehouse: 340 ...

Upgrading to Apache Iceberg 1.12.0 Without Breaking Your Engines

Upgrading to Apache Iceberg 1.12.0 Without Breaking Your Engines

Your Spark jobs pin one Iceberg version. Your Flink streaming sink pins another. PyIceberg runs inside a few notebooks and a Lambda function, and your REST catalog server embeds its own copy of the Ic...

Work with Alex