Чтение avro в spark из s3
import pyspark
import os
S3_ACCESS_KEY = os.environ.get(“S3_ACCESS_KEY”)
S3_BUCKET = os.environ.get(“S3_BUCKET”)
S3_SECRET_KEY = os.environ.get(“S3_SECRET_KEY”)
S3_ENDPOINT = os.environ.get(“S3_ENDPOINT”)
This cell may take some time to run the first time, as it must download the necessary spark jars
conf = pyspark.SparkConf()
IF YOU ARE USING THE SPARK CONTAINERS, UNCOMMENT THE LINE BELOW TO OFFLOAD EXECUTION OF SPARK TASKS TO SPARK CONTAINERS
#conf.setMaster(“spark://spark:7077”)
conf.set(“spark.jars.packages”, ‘org.apache.hadoop:hadoop-aws:3.3.1,io.delta:delta-core_2.12:2.1.0,org.apache.spark:spark-avro_2.12:3.3.2’)
conf.set(‘spark.hadoop.fs.s3a.aws.credentials.provider’, ‘org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider’)
conf.set(‘spark.hadoop.fs.s3a.endpoint’, S3_ENDPOINT)
conf.set(‘spark.hadoop.fs.s3a.access.key’, S3_ACCESS_KEY)
conf.set(‘spark.hadoop.fs.s3a.secret.key’, S3_SECRET_KEY)
conf.set(‘spark.hadoop.fs.s3a.path.style.access’, “true”)
conf.set(“spark.sql.extensions”, “io.delta.sql.DeltaSparkSessionExtension”)
conf.set(“spark.sql.catalog.spark_catalog”, “org.apache.spark.sql.delta.catalog.DeltaCatalog”)
sc = pyspark.SparkContext(conf=conf)
sc.setLogLevel(“INFO”)
spark = pyspark.sql.SparkSession(sc)
df = spark.read.format(“avro”).load(f“s3a://{S3_BUCKET}/person2.avro”)
Загрузка данных iceberg в Trino
Создание схем
CREATE SCHEMA delta.my_schema_d
WITH (location = ‘s3a://test/delta_p’);
CREATE SCHEMA hive.my_schema_h
WITH (location = ‘s3a://test/hive_p’);
CREATE SCHEMA iceberg.my_schema_i
WITH (location = ‘s3a://test/iceberg_p’);
Создание таблицы на базе CSV
create table hive.my_schema_h.taxi_p (
VendorID bigint,
tpep_pickup_datetime varchar,
tpep_dropoff_datetime varchar,
passenger_count bigint,
trip_distance decimal(20,2),
RatecodeID bigint,
store_and_fwd_flag varchar,
PULocationID bigint,
DOLocationID bigint,
payment_type bigint,
fare_amount decimal(20,2),
extra decimal(20,2),
mta_tax decimal(20,2),
tip_amount decimal(20,2),
tolls_amount decimal(20,2),
improvement_surcharge decimal(20,2),
total_amount decimal(20,2))
WITH (
format = ‘TEXTFILE’,
textfile_field_separator = ‘,’,
skip_header_line_count=1
);
Создание таблицы iceberg
create table iceberg.my_schema_i.taxi_i (
VendorID bigint,
tpep_pickup_datetime varchar,
tpep_dropoff_datetime varchar,
passenger_count bigint,
trip_distance decimal(20,2),
RatecodeID bigint,
store_and_fwd_flag varchar,
PULocationID bigint,
DOLocationID bigint,
payment_type bigint,
fare_amount decimal(20,2),
extra decimal(20,2),
mta_tax decimal(20,2),
tip_amount decimal(20,2),
tolls_amount decimal(20,2),
improvement_surcharge decimal(20,2),
total_amount decimal(20,2))
Запись таблицы iceberg
insert into iceberg.my_schema_i.taxi_i select * from hive.my_schema_h.taxi_p
Классификация в Trino
CREATE SCHEMA delta.my_schema_d
WITH (location = ‘s3a://test/delta_p’);
CREATE TABLE delta.my_schema_d.iris (
id int
, sepal_length double
, sepal_width double
, petal_length double
, petal_width double
, species varchar
);
INSERT INTO delta.my_schema_d.iris VALUES
(1, 5.1, 3.5, 1.4, 0.2, ‘Iris-setosa’),
(2, 4.9, 3, 1.4, 0.2, ‘Iris-setosa’),
(3, 4.7, 3.2, 1.3, 0.2, ‘Iris-setosa’),
(4, 4.6, 3.1, 1.5, 0.2, ‘Iris-setosa’),
(5, 5, 3.6, 1.4, 0.2, ‘Iris-setosa’),
(6, 5.4, 3.9, 1.7, 0.4, ‘Iris-setosa’),
(7, 4.6, 3.4, 1.4, 0.3, ‘Iris-setosa’),
(8, 5, 3.4, 1.5, 0.2, ‘Iris-setosa’),
(9, 4.4, 2.9, 1.4, 0.2, ‘Iris-setosa’),
(10, 4.9, 3.1, 1.5, 0.1, ‘Iris-setosa’),
(11, 5.4, 3.7, 1.5, 0.2, ‘Iris-setosa’),
(12, 4.8, 3.4, 1.6, 0.2, ‘Iris-setosa’),
(13, 4.8, 3, 1.4, 0.1, ‘Iris-setosa’),
(14, 4.3, 3, 1.1, 0.1, ‘Iris-setosa’),
(15, 5.8, 4, 1.2, 0.2, ‘Iris-setosa’),
(16, 5.7, 4.4, 1.5, 0.4, ‘Iris-setosa’),
(17, 5.4, 3.9, 1.3, 0.4, ‘Iris-setosa’),
(18, 5.1, 3.5, 1.4, 0.3, ‘Iris-setosa’),
(19, 5.7, 3.8, 1.7, 0.3, ‘Iris-setosa’),
(20, 5.1, 3.8, 1.5, 0.3, ‘Iris-setosa’),
(21, 5.4, 3.4, 1.7, 0.2, ‘Iris-setosa’),
(22, 5.1, 3.7, 1.5, 0.4, ‘Iris-setosa’),
(23, 4.6, 3.6, 1, 0.2, ‘Iris-setosa’),
(24, 5.1, 3.3, 1.7, 0.5, ‘Iris-setosa’),
(25, 4.8, 3.4, 1.9, 0.2, ‘Iris-setosa’),
(26, 5, 3, 1.6, 0.2, ‘Iris-setosa’),
(27, 5, 3.4, 1.6, 0.4, ‘Iris-setosa’),
(28, 5.2, 3.5, 1.5, 0.2, ‘Iris-setosa’),
(29, 5.2, 3.4, 1.4, 0.2, ‘Iris-setosa’),
(30, 4.7, 3.2, 1.6, 0.2, ‘Iris-setosa’),
(31, 4.8, 3.1, 1.6, 0.2, ‘Iris-setosa’),
(32, 5.4, 3.4, 1.5, 0.4, ‘Iris-setosa’),
(33, 5.2, 4.1, 1.5, 0.1, ‘Iris-setosa’),
(34, 5.5, 4.2, 1.4, 0.2, ‘Iris-setosa’),
(35, 4.9, 3.1, 1.5, 0.1, ‘Iris-setosa’),
(36, 5, 3.2, 1.2, 0.2, ‘Iris-setosa’),
(37, 5.5, 3.5, 1.3, 0.2, ‘Iris-setosa’),
(38, 4.9, 3.1, 1.5, 0.1, ‘Iris-setosa’),
(39, 4.4, 3, 1.3, 0.2, ‘Iris-setosa’),
(40, 5.1, 3.4, 1.5, 0.2, ‘Iris-setosa’),
(41, 5, 3.5, 1.3, 0.3, ‘Iris-setosa’),
(42, 4.5, 2.3, 1.3, 0.3, ‘Iris-setosa’),
(43, 4.4, 3.2, 1.3, 0.2, ‘Iris-setosa’),
(44, 5, 3.5, 1.6, 0.6, ‘Iris-setosa’),
(45, 5.1, 3.8, 1.9, 0.4, ‘Iris-setosa’),
(46, 4.8, 3, 1.4, 0.3, ‘Iris-setosa’),
(47, 5.1, 3.8, 1.6, 0.2, ‘Iris-setosa’),
(48, 4.6, 3.2, 1.4, 0.2, ‘Iris-setosa’),
(49, 5.3, 3.7, 1.5, 0.2, ‘Iris-setosa’),
(50, 5, 3.3, 1.4, 0.2, ‘Iris-setosa’),
(51, 7, 3.2, 4.7, 1.4, ‘Iris-versicolor’),
(52, 6.4, 3.2, 4.5, 1.5, ‘Iris-versicolor’),
(53, 6.9, 3.1, 4.9, 1.5, ‘Iris-versicolor’),
(54, 5.5, 2.3, 4, 1.3, ‘Iris-versicolor’),
(55, 6.5, 2.8, 4.6, 1.5, ‘Iris-versicolor’),
(56, 5.7, 2.8, 4.5, 1.3, ‘Iris-versicolor’),
(57, 6.3, 3.3, 4.7, 1.6, ‘Iris-versicolor’),
(58, 4.9, 2.4, 3.3, 1, ‘Iris-versicolor’),
(59, 6.6, 2.9, 4.6, 1.3, ‘Iris-versicolor’),
(60, 5.2, 2.7, 3.9, 1.4, ‘Iris-versicolor’),
(61, 5, 2, 3.5, 1, ‘Iris-versicolor’),
(62, 5.9, 3, 4.2, 1.5, ‘Iris-versicolor’),
(63, 6, 2.2, 4, 1, ‘Iris-versicolor’),
(64, 6.1, 2.9, 4.7, 1.4, ‘Iris-versicolor’),
(65, 5.6, 2.9, 3.6, 1.3, ‘Iris-versicolor’),
(66, 6.7, 3.1, 4.4, 1.4, ‘Iris-versicolor’),
(67, 5.6, 3, 4.5, 1.5, ‘Iris-versicolor’),
(68, 5.8, 2.7, 4.1, 1, ‘Iris-versicolor’),
(69, 6.2, 2.2, 4.5, 1.5, ‘Iris-versicolor’),
(70, 5.6, 2.5, 3.9, 1.1, ‘Iris-versicolor’),
(71, 5.9, 3.2, 4.8, 1.8, ‘Iris-versicolor’),
(72, 6.1, 2.8, 4, 1.3, ‘Iris-versicolor’),
(73, 6.3, 2.5, 4.9, 1.5, ‘Iris-versicolor’),
(74, 6.1, 2.8, 4.7, 1.2, ‘Iris-versicolor’),
(75, 6.4, 2.9, 4.3, 1.3, ‘Iris-versicolor’),
(76, 6.6, 3, 4.4, 1.4, ‘Iris-versicolor’),
(77, 6.8, 2.8, 4.8, 1.4, ‘Iris-versicolor’),
(78, 6.7, 3, 5, 1.7, ‘Iris-versicolor’),
(79, 6, 2.9, 4.5, 1.5, ‘Iris-versicolor’),
(80, 5.7, 2.6, 3.5, 1, ‘Iris-versicolor’),
(81, 5.5, 2.4, 3.8, 1.1, ‘Iris-versicolor’),
(82, 5.5, 2.4, 3.7, 1, ‘Iris-versicolor’),
(83, 5.8, 2.7, 3.9, 1.2, ‘Iris-versicolor’),
(84, 6, 2.7, 5.1, 1.6, ‘Iris-versicolor’),
(85, 5.4, 3, 4.5, 1.5, ‘Iris-versicolor’),
(86, 6, 3.4, 4.5, 1.6, ‘Iris-versicolor’),
(87, 6.7, 3.1, 4.7, 1.5, ‘Iris-versicolor’),
(88, 6.3, 2.3, 4.4, 1.3, ‘Iris-versicolor’),
(89, 5.6, 3, 4.1, 1.3, ‘Iris-versicolor’),
(90, 5.5, 2.5, 4, 1.3, ‘Iris-versicolor’),
(91, 5.5, 2.6, 4.4, 1.2, ‘Iris-versicolor’),
(92, 6.1, 3, 4.6, 1.4, ‘Iris-versicolor’),
(93, 5.8, 2.6, 4, 1.2, ‘Iris-versicolor’),
(94, 5, 2.3, 3.3, 1, ‘Iris-versicolor’),
(95, 5.6, 2.7, 4.2, 1.3, ‘Iris-versicolor’),
(96, 5.7, 3, 4.2, 1.2, ‘Iris-versicolor’),
(97, 5.7, 2.9, 4.2, 1.3, ‘Iris-versicolor’),
(98, 6.2, 2.9, 4.3, 1.3, ‘Iris-versicolor’),
(99, 5.1, 2.5, 3, 1.1, ‘Iris-versicolor’),
(100, 5.7, 2.8, 4.1, 1.3, ‘Iris-versicolor’),
(101, 6.3, 3.3, 6, 2.5, ‘Iris-virginica’),
(102, 5.8, 2.7, 5.1, 1.9, ‘Iris-virginica’),
(103, 7.1, 3, 5.9, 2.1, ‘Iris-virginica’),
(104, 6.3, 2.9, 5.6, 1.8, ‘Iris-virginica’),
(105, 6.5, 3, 5.8, 2.2, ‘Iris-virginica’),
(106, 7.6, 3, 6.6, 2.1, ‘Iris-virginica’),
(107, 4.9, 2.5, 4.5, 1.7, ‘Iris-virginica’),
(108, 7.3, 2.9, 6.3, 1.8, ‘Iris-virginica’),
(109, 6.7, 2.5, 5.8, 1.8, ‘Iris-virginica’),
(110, 7.2, 3.6, 6.1, 2.5, ‘Iris-virginica’),
(111, 6.5, 3.2, 5.1, 2, ‘Iris-virginica’),
(112, 6.4, 2.7, 5.3, 1.9, ‘Iris-virginica’),
(113, 6.8, 3, 5.5, 2.1, ‘Iris-virginica’),
(114, 5.7, 2.5, 5, 2, ‘Iris-virginica’),
(115, 5.8, 2.8, 5.1, 2.4, ‘Iris-virginica’),
(116, 6.4, 3.2, 5.3, 2.3, ‘Iris-virginica’),
(117, 6.5, 3, 5.5, 1.8, ‘Iris-virginica’),
(118, 7.7, 3.8, 6.7, 2.2, ‘Iris-virginica’),
(119, 7.7, 2.6, 6.9, 2.3, ‘Iris-virginica’),
(120, 6, 2.2, 5, 1.5, ‘Iris-virginica’),
(121, 6.9, 3.2, 5.7, 2.3, ‘Iris-virginica’),
(122, 5.6, 2.8, 4.9, 2, ‘Iris-virginica’),
(123, 7.7, 2.8, 6.7, 2, ‘Iris-virginica’),
(124, 6.3, 2.7, 4.9, 1.8, ‘Iris-virginica’),
(125, 6.7, 3.3, 5.7, 2.1, ‘Iris-virginica’),
(126, 7.2, 3.2, 6, 1.8, ‘Iris-virginica’),
(127, 6.2, 2.8, 4.8, 1.8, ‘Iris-virginica’),
(128, 6.1, 3, 4.9, 1.8, ‘Iris-virginica’),
(129, 6.4, 2.8, 5.6, 2.1, ‘Iris-virginica’),
(130, 7.2, 3, 5.8, 1.6, ‘Iris-virginica’),
(131, 7.4, 2.8, 6.1, 1.9, ‘Iris-virginica’),
(132, 7.9, 3.8, 6.4, 2, ‘Iris-virginica’),
(133, 6.4, 2.8, 5.6, 2.2, ‘Iris-virginica’),
(134, 6.3, 2.8, 5.1, 1.5, ‘Iris-virginica’),
(135, 6.1, 2.6, 5.6, 1.4, ‘Iris-virginica’),
(136, 7.7, 3, 6.1, 2.3, ‘Iris-virginica’),
(137, 6.3, 3.4, 5.6, 2.4, ‘Iris-virginica’),
(138, 6.4, 3.1, 5.5, 1.8, ‘Iris-virginica’),
(139, 6, 3, 4.8, 1.8, ‘Iris-virginica’),
(140, 6.9, 3.1, 5.4, 2.1, ‘Iris-virginica’),
(141, 6.7, 3.1, 5.6, 2.4, ‘Iris-virginica’),
(142, 6.9, 3.1, 5.1, 2.3, ‘Iris-virginica’),
(143, 5.8, 2.7, 5.1, 1.9, ‘Iris-virginica’),
(144, 6.8, 3.2, 5.9, 2.3, ‘Iris-virginica’),
(145, 6.7, 3.3, 5.7, 2.5, ‘Iris-virginica’),
(146, 6.7, 3, 5.2, 2.3, ‘Iris-virginica’),
(147, 6.3, 2.5, 5, 1.9, ‘Iris-virginica’),
(148, 6.5, 3, 5.2, 2, ‘Iris-virginica’),
(149, 6.2, 3.4, 5.4, 2.3, ‘Iris-virginica’),
(150, 5.9, 3, 5.1, 1.8, ‘Iris-virginica’);
select classify(features(5.8, 3, 5.1, 1.8), model) AS prediction
FROM (
SELECT learn_classifier(species, features(sepal_length, sepal_width, petal_length, petal_width)) AS model FROM delta.my_schema_d.iris
) t;
Iris-virginica
Чтение json в spark из s3
import pyspark
import os
S3_ACCESS_KEY = os.environ.get(“S3_ACCESS_KEY”)
S3_BUCKET = os.environ.get(“S3_BUCKET”)
S3_SECRET_KEY = os.environ.get(“S3_SECRET_KEY”)
S3_ENDPOINT = os.environ.get(“S3_ENDPOINT”)
This cell may take some time to run the first time, as it must download the necessary spark jars
conf = pyspark.SparkConf()
IF YOU ARE USING THE SPARK CONTAINERS, UNCOMMENT THE LINE BELOW TO OFFLOAD EXECUTION OF SPARK TASKS TO SPARK CONTAINERS
#conf.setMaster(“spark://spark:7077”)
conf.set(“spark.jars.packages”, ‘org.apache.hadoop:hadoop-aws:3.3.1,io.delta:delta-core_2.12:2.1.0,org.apache.spark:spark-avro_2.12:3.3.2’)
conf.set(‘spark.hadoop.fs.s3a.aws.credentials.provider’, ‘org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider’)
conf.set(‘spark.hadoop.fs.s3a.endpoint’, S3_ENDPOINT)
conf.set(‘spark.hadoop.fs.s3a.access.key’, S3_ACCESS_KEY)
conf.set(‘spark.hadoop.fs.s3a.secret.key’, S3_SECRET_KEY)
conf.set(‘spark.hadoop.fs.s3a.path.style.access’, “true”)
conf.set(“spark.sql.extensions”, “io.delta.sql.DeltaSparkSessionExtension”)
conf.set(“spark.sql.catalog.spark_catalog”, “org.apache.spark.sql.delta.catalog.DeltaCatalog”)
sc = pyspark.SparkContext(conf=conf)
sc.setLogLevel(“INFO”)
spark = pyspark.sql.SparkSession(sc)
df = spark.read.format(‘org.apache.spark.sql.json’).load(f“s3a://{S3_BUCKET}/apple3.json”)
df.show()
Настроил дома сервер Trino
Работает стабильно. Удалось подключить к s3, Kafka и создать таблицу Iceberg.
Что почитать:
https://github.com/rylativity/container-analytics-platform
https://techjogging.com/access-minio-s3-storage-prestodb-cluster-hive-metastore.html
https://medium.com/@danthelion/high-performance-open-source-data-lakehouse-at-home-56c8d7fa87b5
https://janakiev.com/blog/presto-trino-s3/
https://docs.cedrusdata.ru/latest/installation/docker.html
https://ahana.io/learn/machine-learning-with-presto/
http://www.sql-tutorial.ru/en/book_rank_dense_rank_functions.html
https://medium.com/creative-data/interactive-analytics-on-azure-event-hub-with-trino-1b64cfda3f63
https://towardsdatascience.com/kafka-python-explained-in-10-lines-of-code-800e3e07dad1
https://www.baeldung.com/ops/kafka-docker-setup
HADI-циклы: самый короткий гайд по проверке гипотез
Интересная статья на хабре про hadi циклы.
https://habr.com/ru/post/716912/
HADI – решение ваших проблем, связанных с гипотезами. Все мы хотим, чтобы наша работа приносила результат.
Привет, дорогой читатель. Меня зовут Богдан Гончаренко, я ведущий продуктовый дизайнер, ex-EPAM и Сбер Казахстан. Я веду авторский телеграм-канал о продуктовом дизайне, исследованиях и т. д.
А чтобы всем было удобно, я сделал шаблон для Notion, который вы можете скопировать себе и использовать на здоровье. О шаблоне позже, а пока:
Схематичное отображение HADI
Схематичное отображение HADI
Анатомия HADI
HADI – это акроним, в котором кроются четыре главных шага для проверки гипотезы и два дополнительных действия для приоритизации, которых в акрониме нет.
Hypothesis (H) – собственно, гипотеза. То самое предположение, которое выдвинул кто-то из команды и которое вы будете тестировать.
Action (A) – действие. На этом этапе вы решаете, что будете делать, чтобы проверить гипотезу. Проведете ли вы юзабили-тестирование или просто поменяете цвет кнопки – зависит от вашей гипотезы.
Data (D) – данные. Любые показатели, на которые вы хотите повлиять.
Insight (I) – инсайт. Многие интерпретируют этот этап по-разному, но главное, что нужно понимать, этот этап открывает глаза на проведенные с гипотезой манипуляции.
И два момента, которых нет в акрониме:
Faith (%) – показатель веры вашей команды в гипотезу. Считается до 100%. Рекомендую выводить среднее число, так будет проще приоритизировать гипотезы в дальнейшем.
Complexity / Difficulty – сложность. Тоже среднее значение от 0 до 5. Тут вы обсуждаете, насколько сложно, трудно и невообразимо тяжко проверить эту гипотезу или же имплементировать ее.
Порядок действий
Чтобы всем было проще и нагляднее, я подготовил шаблон в Notion для одной гипотезы. Таблица считает среднее значение по вере и сложности.
→ Скопировать шаблон в Notion
Шаблон для работы по HADI-циклам
Шаблон для работы по HADI-циклам
На скриншоте можно увидеть дополнительное пояснение в каждой колонке. Давайте разберем порядок работы с таблицей и обратимся к пояснениям:
Для начала, у вас должна быть гипотеза. (Если что-то сделать, то будет нечто)
Далее вы пишете способ, которым будете валидировать свою гипотезу и/или действия, которые нужно предпринять, чтобы проверить гипотезу.
Третьим пунктом стоит желаемая метрика или показатель успешности гипотезы.
Колонка “инсайт” отвечает за успех или провал гипотезы.
Вера в гипотезу заполняется в процентах и под таблицей выводится средний показатель веры в гипотезу каждого члена команды.
Сложность проверки и разработки гипотезы так же выводится средним значением, но уже по пятибальной шкале.
Порядок линейный, но как заполнить Data и Insight, которые стоят по середине, если работа над гипотезой еще не была проведена, а вы уже должны вписать веру и сложность?
Все максимально прозаично. Я рекомендую на гипотезу указывать, извиняюсь за тавтологию, гипотетические данные в колонки Data и Insight. То есть, вы заранее думаете, какая метрика может привести гипотезу к успеху и насколько сильно она может повлиять на искомый показатель. А после проверки вы приносите реальные данные и сравниваете.
Предостережния и советы
Несколько советов по работе с HADI-циклами.
не тестируйте очевидные гипотезы.“Если убрать кнопку покупки, продажи упадут”
не нужно тестировать факты
после завершения тестирования гипотезы работа над ней не обязательно должна быть закончена. Всегда внимательно следите за результатом и анализируйте показатели. Не довольны? Повторите.
приоритизировать финальный результат, на самом деле, можно и по RICE
фреймворк SMART – отличный метод для составления гипотез и великолепно применяется в HADI
Если статья и шаблон оказались для вас полезными, буду искренне благодарен подписке на мой телеграм-канал, где я пишу о продуктовом дизайне, исследованиях, различных фреймворках и многом другом.
Покатушки в Степаново
Оригинал:
После апскейла через tost.ai:
И еще
С Новым годом 🎄
С новым счастьем 🐇🎉🎄🎆
Запустил пару нод на mystnodes.com
Проект конечно интересный, но приносит не так много денег, как хотелось бы. За пару дней работы около двух долларов с четырех нод. Выгодней оказалась та, что подключена в гигабитному интернету. Так что смысл есть в запуске, если у вас действительно хороший канал связи. Проект реализует услуги децентрализованного vpn сервиса и принимает оплату в крипте (запрещено в рф). В планах запустить ноду ankr. Это уже будет посерьезнее.