Есть таблица, состоящая из поездок такси в Нью-Йорке.
Необходимо, используя таблицу поездок для каждого дня рассчитать процент поездок по количеству человек в машине (без пассажиров, 1, 2, 3, 4 и более пассажиров). Также добавить столбцы к предыдущим результатам с самой дорогой и самой дешевой поездкой для каждой группы.
По итогу должна получиться таблица (parquet) с колонками date, percentage_zero, percentage_1p, percentage_2p, percentage_3p, percentage_4p_plus. Технологический стек – sql, scala (что-то одно).
Дополнительно: также провести аналитику и построить график на тему “как пройденное расстояние и количество пассажиров влияет на чаевые” в любом удобном инструменте.
Технологический стек – Apache Spark 3.3.1, Scala 12, Kubernetes (Minikube 1.28.0).
Kubernetes - оркестратор контейнеров промышленного уровня.
Spark - самый главный инструмент для трансформации данных. Он легко может загрузить csv файл и выгрузить результат в parquet.
Scala хороша тем, что это типизированный язык. Много синтаксических ошибок будет выявлено ещё на этапе компиляции.
В качестве файловой системы используется обычная файловая система хостовой машины.
CSV файл кладется куда-то в локальную папку. Эта папка монтируется в Kubernetes. Оттуда его берет Spark и после некоторых трансформаций кладет parquet файлы обратно в эту папку.
Статья о том как монтировать локальную папку в Kubernetes.
minikube version: v1.28.0
Пример
minikube start --driver=kvm2
# Билдим образ:
docker build -f ./docker/Dockerfile -t izair/taxi_service:1.0.5 .
docker push izair/taxi_service:1.0.5
# Заранее пулим:
minikube ssh docker pull izair/taxi_service:1.0.5
# Монтируем папку на minikube:
minikube mount /source_path:/tmp/taxi_service
# Проверим, что она там есть:
minikube ssh
ls /tmp/taxi_service
exit
# Потом смонтированную папку смонтируем на POD:
export VOLUME_TYPE=hostPath
export VOLUME_NAME=demo-host-mount
export MOUNT_PATH=/tmp/taxi_service
# Открываем порт 8001:
kubectl proxy
spark-submit \
--master=k8s://http://127.0.0.1:8001 \
--deploy-mode cluster \
--name taxi_service \
--class org.example.App \
--conf "spark.kubernetes.container.image=izair/taxi_service:1.0.5" \
--conf spark.kubernetes.driver.volumes.$VOLUME_TYPE.$VOLUME_NAME.mount.path=$MOUNT_PATH \
--conf spark.kubernetes.driver.volumes.$VOLUME_TYPE.$VOLUME_NAME.options.path=$MOUNT_PATH \
--conf spark.kubernetes.executor.volumes.$VOLUME_TYPE.$VOLUME_NAME.mount.path=$MOUNT_PATH \
--conf spark.kubernetes.executor.volumes.$VOLUME_TYPE.$VOLUME_NAME.options.path=$MOUNT_PATH \
--conf spark.executor.instances=1 \
--conf spark.driver.memory=512m \
--conf spark.executor.memory=512m \
--conf spark.driver.cores=1 \
--conf spark.executor.cores=1 \
--conf spark.kubernetes.namespace=default \
local:///opt/taxi_service-1.0-jar-with-dependencies.jar
# Смотрим логи:
minikube dashboard
В результате был создан проект со следующей структурой:
.
├── analysis # jupyter notebook analysis
├── data # data files
├── docker # docker files
├── docs # documentation
├── images # screenshots
├── src # source files
└── README.md
В папке data лежит файл head.csv с первыми несколькими строками из yellow_tripdata_2020-01.csv и parquet файл с результатом его обработки.
На основании графиков можно сделать следующие выводы:
-
Если убрать выбросы, то видно, что постепенно горка опускается. Значит чем больше дистанция поездки, тем меньше чаевые. Возможно, люди думают, что если много заплатить за поездку, то чаевых можно не оставлять.
-
Опять же, если убрать выбросы, то видно, что чем больше пассажиров, тем меньше чаевых они оставляли. Больше всего оставляет один человек.