From c57eccb0caa86c2f9c70b8553398d085c041ae0c Mon Sep 17 00:00:00 2001 From: Rodrigo Torres Date: Thu, 19 Aug 2021 21:57:32 -0300 Subject: [PATCH 01/25] bugfix: Fixed diff-2-module --- docs/ChangeLog.md | 8 ++++++++ rony/module_writer.py | 14 +++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md index 41a1bd5..973c800 100644 --- a/docs/ChangeLog.md +++ b/docs/ChangeLog.md @@ -1,5 +1,13 @@ # Change Log +## Version 0.3.2 (dev) + +- Bugfixes: + - Gitlab CI fix on production plan step + - Fixes on diif-2-module function + - Added dependencies field to json file created + - Fixed issue that would not add new files to created module + ## Version 0.3.1 - Bugfixes diff --git a/rony/module_writer.py b/rony/module_writer.py index 3bce338..7dbc151 100644 --- a/rony/module_writer.py +++ b/rony/module_writer.py @@ -212,13 +212,18 @@ def create_module_from_diff(module_name): patch_file = f".rony_{module_name}.patch" module_path = os.path.join(os.path.expanduser("~"), "MyRonyModules", module_name) - p = subprocess.call(["git", "diff", "--no-prefix"], stdout=open(patch_file, "w")) + git_command = "git add -N -A; git diff --no-prefix" + ret = subprocess.run( + git_command, + capture_output=True, + shell=True, + ) - patch_set = PatchSet.from_filename(patch_file) + patch_set = PatchSet(ret.stdout.decode()) for patched_file in patch_set: - file_path = patched_file.path + file_path = patched_file.target_file added_lines = [] for hunk in patched_file: for line in hunk: @@ -234,8 +239,6 @@ def create_module_from_diff(module_name): with open(module_file_path, "w") as f: f.write("".join(added_lines)) - os.remove(patch_file) - info = click.prompt("Please your modules description", default="") inst = click.prompt( "Please instructions to be displayed to the users after they add this module", @@ -252,6 +255,7 @@ def create_module_from_diff(module_name): "developers": [developer], "input_info": [], "version": "0.0.0", + "dependencies": [], }, sort_keys=True, indent=4, From 5535884b4adfc26c6e6fb520c268df8a30d89ce5 Mon Sep 17 00:00:00 2001 From: massao Mitsunaga Date: Mon, 23 Aug 2021 14:12:53 -0300 Subject: [PATCH 02/25] feat:added workspace & acc number to crawler path --- .../aws_glue_crawler/infrastructure/aws/crawler.tf | 2 +- .../aws_glue_crawler/infrastructure/aws/variables.tf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rony/module_templates/aws_glue_crawler/infrastructure/aws/crawler.tf b/rony/module_templates/aws_glue_crawler/infrastructure/aws/crawler.tf index 5b013ef..07aadc3 100644 --- a/rony/module_templates/aws_glue_crawler/infrastructure/aws/crawler.tf +++ b/rony/module_templates/aws_glue_crawler/infrastructure/aws/crawler.tf @@ -5,7 +5,7 @@ resource "aws_glue_crawler" "glue_crawler" { role = aws_iam_role.glue_role.arn s3_target { - path = var.bucket_paths[count.index] + path = "${local.prefix}-${var.bucket_paths[count.index]}-${var.account}" } tags = local.common_tags diff --git a/rony/module_templates/aws_glue_crawler/infrastructure/aws/variables.tf b/rony/module_templates/aws_glue_crawler/infrastructure/aws/variables.tf index 2c7d9ea..67daa47 100644 --- a/rony/module_templates/aws_glue_crawler/infrastructure/aws/variables.tf +++ b/rony/module_templates/aws_glue_crawler/infrastructure/aws/variables.tf @@ -13,8 +13,8 @@ variable "bucket_paths" { description = "Paths to S3 bucket used by the crawler" type = list(string) default = [ - "s3://landing-zone-123456789", - "s3://processing-zone-123456789", - "s3://delivery-zone-123456789" + "s3://landing-zone", + "s3://processing-zone", + "s3://delivery-zone" ] } \ No newline at end of file From c541f5b535cadb74dfbb472aaf034e9e8930901e Mon Sep 17 00:00:00 2001 From: massao Mitsunaga Date: Mon, 23 Aug 2021 14:46:07 -0300 Subject: [PATCH 03/25] feat:added kinesis stream module --- rony/cli_aux.py | 3 +++ rony/module_templates/aws_kinesis_stream.json | 21 +++++++++++++++++++ .../infrastructure/aws/kinesis_stream.tf | 13 ++++++++++++ .../infrastructure/aws/variables.tf | 3 +++ 4 files changed, 40 insertions(+) create mode 100644 rony/module_templates/aws_kinesis_stream.json create mode 100644 rony/module_templates/aws_kinesis_stream/infrastructure/aws/kinesis_stream.tf create mode 100644 rony/module_templates/aws_kinesis_stream/infrastructure/aws/variables.tf diff --git a/rony/cli_aux.py b/rony/cli_aux.py index ad58acc..2370a01 100644 --- a/rony/cli_aux.py +++ b/rony/cli_aux.py @@ -48,6 +48,7 @@ def get_modules_to_add(command, opts, ctx): "aws_simple_storage_service", "aws_glue_crawler", "aws_lambda_function", + "aws_kinesis_stream" ] else: if click.confirm("Add S3 module?", default=True): @@ -56,6 +57,8 @@ def get_modules_to_add(command, opts, ctx): all_modules.append("aws_glue_crawler") if click.confirm("Add LAMBDA FUNCTION module?", default=True): all_modules.append("aws_lambda_function") + if click.confirm("Add KINESIS STREAM module?", default=True): + all_modules.append("aws_kinesis_stream") if opts["provider"] == "gcp": diff --git a/rony/module_templates/aws_kinesis_stream.json b/rony/module_templates/aws_kinesis_stream.json new file mode 100644 index 0000000..c71729d --- /dev/null +++ b/rony/module_templates/aws_kinesis_stream.json @@ -0,0 +1,21 @@ +{ + "info": "Module for deploying AWS Kinesis Stream", + "instructions": [ + "" + ], + "developers": [ + "massao.mitsunaga@a3data.com.br", + "hery.barbosa@a3data.com.br" + ], + "input_info": [ + [ + "project_start_date", + "23/08/2021", + "Initial development aws modules" + ] + ], + "version": "0.0.1", + "dependencies": [ + "__AWS_BASE__" + ] +} \ No newline at end of file diff --git a/rony/module_templates/aws_kinesis_stream/infrastructure/aws/kinesis_stream.tf b/rony/module_templates/aws_kinesis_stream/infrastructure/aws/kinesis_stream.tf new file mode 100644 index 0000000..aa18278 --- /dev/null +++ b/rony/module_templates/aws_kinesis_stream/infrastructure/aws/kinesis_stream.tf @@ -0,0 +1,13 @@ +resource "aws_kinesis_stream" "rony_kinesis_stream" { + name = "${local.prefix}-${var.kinesis_stream_name}-${var.account}" + shard_count = 1 + retention_period = 48 + + shard_level_metrics = [ + "IncomingBytes", + "OutgoingBytes", + ] + + tags = local.common_tags + +} \ No newline at end of file diff --git a/rony/module_templates/aws_kinesis_stream/infrastructure/aws/variables.tf b/rony/module_templates/aws_kinesis_stream/infrastructure/aws/variables.tf new file mode 100644 index 0000000..dc787da --- /dev/null +++ b/rony/module_templates/aws_kinesis_stream/infrastructure/aws/variables.tf @@ -0,0 +1,3 @@ +variable "kinesis_stream_name" { + default = "rony_kinesis_stream" +} \ No newline at end of file From b756d1350f233b6dddbfc69f5fcf5b23aefcf772 Mon Sep 17 00:00:00 2001 From: massao Mitsunaga Date: Tue, 24 Aug 2021 10:55:21 -0300 Subject: [PATCH 04/25] feat:quickstart updated --- docs/QuickStart.md | 49 ++++++++++++++-------------------------------- 1 file changed, 15 insertions(+), 34 deletions(-) diff --git a/docs/QuickStart.md b/docs/QuickStart.md index 3d58da0..9100191 100644 --- a/docs/QuickStart.md +++ b/docs/QuickStart.md @@ -33,49 +33,30 @@ source _env/bin/activate pip install -r requirements.txt ``` -4) Rony has also some handy cli commands to build and run docker images locally. You can do - -```bash -cd etl -rony build : -``` - -to build an image and run it with +## Implementation suggestions -```bash -rony run : -``` +When you start a new `rony` project, you will by default create a project with `aws` as `provider` and you will be asked which modules you want to implement in yout project. -In this particular implementation, `run.py` has a simple etl code that accepts a parameter to filter the data based on the `Sex` column. To use that, you can do +You can implement modules after the project creation using the following command in your project's root folder. ```bash -docker run : -s female +rony add-module ``` -## Implementation suggestions - -When you start a new `rony` project, you will find - -- an `infrastructure` folder with terraform code creating on AWS: - - an S3 bucket - - a Lambda function - - a CloudWatch log group - - a ECR repository - - a AWS Glue Crawler - - IAM roles and policies for lambda and glue +The module_name can be found on the module_templates folder in the rony project folder. -- an `etl` folder with: - - a `Dockerfile` and a `run.py` example of ETL code - - a `lambda_function.py` with a "Hello World" example +When you start a new `rony` project, you will find: -- a `tests` folder with unit testing on the Lambda function -- a `.github/workflow` folder with a Github Actions CI/CD pipeline suggestion. This pipeline - - Tests lambda function - - Builds and runs the docker image - - Sets AWS credentials - - Make a terraform plan (but not actually deploy anything) +- an `infrastructure` folder with terraform code creating on the chosen provider: + - a backend file + - For the aws provider, you will need to create a bucket manually and reference its name on the bucket variable. + - a provider file + - a variables file + - files for the modules implemented during the project creation -- a `dags` folder with some **Airflow** example code.f +- a `CI` folder with a docker-composer file and CI scripts and tests + +- a `Makefile` file containing shortcut commands for the project You also have a `scripts` folder with a bash file that builds a lambda deploy package. From a965a1e80de883cef9dd7ab7e69dc27307768914 Mon Sep 17 00:00:00 2001 From: pltoledo Date: Mon, 30 Aug 2021 15:20:09 -0300 Subject: [PATCH 05/25] add: initial framework for creating Spark processing classes and structuring spark applications. File with custom udfs and methods. --- rony/module_templates/spark/data_source.py | 75 ++++++++++++ rony/module_templates/spark/main.py | 13 +++ rony/module_templates/spark/processing.py | 128 +++++++++++++++++++++ rony/module_templates/spark/spark_utils.py | 98 ++++++++++++++++ 4 files changed, 314 insertions(+) create mode 100644 rony/module_templates/spark/data_source.py create mode 100644 rony/module_templates/spark/main.py create mode 100644 rony/module_templates/spark/processing.py create mode 100644 rony/module_templates/spark/spark_utils.py diff --git a/rony/module_templates/spark/data_source.py b/rony/module_templates/spark/data_source.py new file mode 100644 index 0000000..851f263 --- /dev/null +++ b/rony/module_templates/spark/data_source.py @@ -0,0 +1,75 @@ +from pyspark.sql.dataframe import DataFrame + + +class FlatFile: + """ + Class for reading files with Spark + """ + + def __init__(self, spark_session) -> None: + """ + Instantiate class + + Parameters + ---------- + spark_session : pyspark.sql.session.SparkSession + SparkSession used to read data + + Returns + ------- + self: + returns an instance of the object + """ + self.spark = spark_session + + def read_data(self, file_path, format, **kwargs) -> DataFrame: + """ + Read a Spark DataFrame + + Parameters + ---------- + file_path : str + File path + format: str + name of the file format, e.g. 'csv', 'parquet'. + **kwargs: + Additional reading options passed to `options()`. + Returns + ------- + pyspark.sql.DataFrame + """ + return self.spark.read.format(format).options(**kwargs).load(file_path) + + def write_data(self, df, save_path, format, mode, partitions=None) -> None: + """ + Save a Spark DataFrame + + Parameters + ---------- + save_path : str + Destination path + format : str + name of the destination file format, e.g. 'csv', 'parquet'. + mode : str + specify the mode of writing data, if data already exist in the designed path + * append: Append the contents of the DataFrame to the existing data + * overwrite: Overwrite existing data + * ignore: Silently ignores this operation + * error or errorifexists (default case): Raises an error + partitions : int + number of partitions desired in output files. If greater than `df`'s partitions, `rapartition()` will be used. + Else, `coalesce()` will be used. + + Returns + ------- + self: + returns an instance of the object + """ + if partitions: + df_partitions = df.rdd.getNumPartitions() + if df_partitions >= partitions: + df.coalesce(partitions).write.format(format).save(save_path, mode=mode) + else: + df.repartition(partitions).write.format(format).save(save_path, mode=mode) + else: + df.write.format(format).save(save_path, mode=mode) diff --git a/rony/module_templates/spark/main.py b/rony/module_templates/spark/main.py new file mode 100644 index 0000000..3495e42 --- /dev/null +++ b/rony/module_templates/spark/main.py @@ -0,0 +1,13 @@ +from pyspark.sql import SparkSession +from processing import SparkCleaner + +if __name__ == "__main__": + spark = ( + SparkSession + .builder + .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") + .getOrCreate() + ) + cleaner = SparkCleaner(spark) + cleaner.clean() + spark.stop() \ No newline at end of file diff --git a/rony/module_templates/spark/processing.py b/rony/module_templates/spark/processing.py new file mode 100644 index 0000000..1ea254d --- /dev/null +++ b/rony/module_templates/spark/processing.py @@ -0,0 +1,128 @@ +import pyspark.sql.functions as f +from pyspark.sql.window import Window +from data_source import FlatFile +from spark_utils import unidecode_udf, convert_decimal_udf + +FILE_PATHS = { + 'data': 'path/to/file' +} + +class SparkCleaner: + """ + Class used to clean perform basic cleaning with Spark + """ + + def __init__(self, spark_session) -> None: + """ + Instantiates class + + Parameters + ---------- + spark_session : pyspark.sql.session.SparkSession + SparkSession that is used to manipulate data. + + Returns + ------- + self: + returns an instance of the object + """ + self.spark = spark_session + self.ff_source = FlatFile(spark_session) + self.read_options = {} + self.save_path = 'destination/path' + + def read_data(self, format) -> None: + """ + Reads raw data for cleaning. + + Parameters + ---------- + format : str + name of the destination file format, e.g. 'csv', 'parquet'. + + Returns + ------- + self: + returns an instance of the object + """ + self.df = self.ff_source.read_data(FILE_PATHS['data'], format, **self.read_options) + + def clean_types(self) -> None: + """ + Cleans DataFrame column types. + + Parameters + ---------- + None + + Returns + ------- + self: + returns an instance of the object + """ + str_cols = [] + for c in str_cols: + self.df = self.df.withColumn(c, unidecode_udf(f.initcap(f.trim(c)))) + + dbl_cols = [] + for c in dbl_cols: + self.df = self.df.withColumn(c, convert_decimal_udf(f.col(c))) + + date_cols = [] + for c in date_cols: + self.df = self.df.withColumn(c, f.to_date(c, 'dd/MM/yyyy')) + + def clean_specific(self) -> None: + """ + Performs cleaning operations specific to this DataFrame. + + Parameters + ---------- + None + + Returns + ------- + self: + returns an instance of the object + """ + self.df_cleaned = self.df + + def write_data(self, format, mode='error') -> None: + """ + Saves intermediate DataFrames generated in this process. + + Parameters + ---------- + format : str + name of the destination file format, e.g. 'csv', 'parquet'. + mode : str + specify the mode of writing data, if data already exist in the designed path + * append: Append the contents of the DataFrame to the existing data + * overwrite: Overwrite existing data + * ignore: Silently ignores this operation + * error or errorifexists (default case): Raises an error + + Returns + ------- + self: + returns an instance of the object + """ + self.ff_source.write_data(self.df_cleaned, self.save_path, format, mode) + + def clean(self) -> None: + """ + Wrapper for running cleaner. + + Parameters + ---------- + None + + Returns + ------- + self: + returns an instance of the object + """ + self.read_data('csv') + self.clean_types() + self.clean_specific() + self.write_data('parquet') \ No newline at end of file diff --git a/rony/module_templates/spark/spark_utils.py b/rony/module_templates/spark/spark_utils.py new file mode 100644 index 0000000..52bfa4d --- /dev/null +++ b/rony/module_templates/spark/spark_utils.py @@ -0,0 +1,98 @@ +import pyspark.sql.functions as f +import pyspark.sql.types as t +from pyspark.sql.dataframe import DataFrame +from unidecode import unidecode +import numpy as np +import os +import re + +def get_spark_versions() -> 'list[str]': + spark_home = os.environ['SPARK_HOME'] + spark_version = re.search('(?<=spark-).+(?=-bin)', spark_home).group(0) + hadoop_version = re.search('(?<=hadoop).+', spark_home).group(0) + return (spark_version, hadoop_version) + +spark_version, hadoop_version = get_spark_versions() + +if int(spark_version[0]) < 3: + def transform(self, f) -> DataFrame: + return f(self) + + DataFrame.transform = transform + +# UDFs + +@f.udf(returnType=t.StringType()) +def unidecode_udf(string): + if not string: + return None + else: + return unidecode(string) + +@f.udf(returnType=t.DoubleType()) +def convert_decimal_udf(string): + if string is None: + return None + else: + string = string.replace(",", ".") + return float(string.replace(".", "", string.count(".") - 1)) + +@f.udf(returnType=t.FloatType()) +def array_product_udf(array): + if not array: + return None + else: + array = [e for e in array if e is not None] + return float(np.prod(array)) + + +@f.udf(returnType=t.FloatType()) +def array_sum_udf(array): + if not array: + return None + else: + array = [e for e in array if e is not None] + return sum(array) + + +# Custom methods + +def df_from_struct(cols, extract_col, explode) -> DataFrame: + def _(df): + if explode: + df = df.withColumn(extract_col, f.explode(extract_col)) + struct_cols = df.select(f'{extract_col}.*').columns + renamed_cols = [] + for c in struct_cols: + col_ref = f.col(f'{extract_col}.' + c) + if c in cols: + renamed_cols.append(col_ref.alias(c + '_struct')) + else: + renamed_cols.append(col_ref) + return df.select(*cols, *renamed_cols) + return _ + +def renamer(dict) -> DataFrame: + def _(df): + for c, n in dict.items(): + df = df.withColumnRenamed(c, n) + return df + return _ + + +def unpivot(*args, col_name="categorias", value_name="valor") -> DataFrame: + if not args[0]: + key_cols = [] + else: + key_cols = args[0] if type(args[0]) is list else args + + def _(df): + unpivot_cols = [c for c in df.columns if c not in key_cols] + groups_str = [f"'{i}', `{i}`" for i in unpivot_cols] + unpivot_string = ", ".join(groups_str) + unpivot_query = "stack({}, {}) as ({}, {})".format( + len(unpivot_cols), unpivot_string, col_name, value_name + ) + return df.selectExpr(*key_cols, unpivot_query) + + return _ \ No newline at end of file From 6e33e8ecd6a86d8bf82fe9fb39753b0d1d048419 Mon Sep 17 00:00:00 2001 From: pltoledo Date: Mon, 30 Aug 2021 15:34:18 -0300 Subject: [PATCH 06/25] add: module template config file for spark module --- rony/module_templates/spark.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 rony/module_templates/spark.json diff --git a/rony/module_templates/spark.json b/rony/module_templates/spark.json new file mode 100644 index 0000000..e13e25f --- /dev/null +++ b/rony/module_templates/spark.json @@ -0,0 +1,12 @@ +{ + "info": "Module for developing Spark classes", + "instructions": [ + "" + ], + "developers": [ + "pedro.toledo@a3data.com.br" + ], + "input_info": [], + "version": "0.0.1", + "dependencies": [] +} \ No newline at end of file From 8b378585ac6b78ad0b755ea6ff88ddc28108505f Mon Sep 17 00:00:00 2001 From: pltoledo Date: Thu, 2 Sep 2021 19:51:03 -0300 Subject: [PATCH 07/25] fix: structure module and add dependencie in module .json --- rony/module_templates/spark.json | 4 +- rony/module_templates/spark/data_source.py | 75 ------------ rony/module_templates/spark/main.py | 13 --- rony/module_templates/spark/processing.py | 128 --------------------- rony/module_templates/spark/spark_utils.py | 98 ---------------- 5 files changed, 3 insertions(+), 315 deletions(-) delete mode 100644 rony/module_templates/spark/data_source.py delete mode 100644 rony/module_templates/spark/main.py delete mode 100644 rony/module_templates/spark/processing.py delete mode 100644 rony/module_templates/spark/spark_utils.py diff --git a/rony/module_templates/spark.json b/rony/module_templates/spark.json index e13e25f..4f837ba 100644 --- a/rony/module_templates/spark.json +++ b/rony/module_templates/spark.json @@ -8,5 +8,7 @@ ], "input_info": [], "version": "0.0.1", - "dependencies": [] + "dependencies": [ + "CI_workflows" + ] } \ No newline at end of file diff --git a/rony/module_templates/spark/data_source.py b/rony/module_templates/spark/data_source.py deleted file mode 100644 index 851f263..0000000 --- a/rony/module_templates/spark/data_source.py +++ /dev/null @@ -1,75 +0,0 @@ -from pyspark.sql.dataframe import DataFrame - - -class FlatFile: - """ - Class for reading files with Spark - """ - - def __init__(self, spark_session) -> None: - """ - Instantiate class - - Parameters - ---------- - spark_session : pyspark.sql.session.SparkSession - SparkSession used to read data - - Returns - ------- - self: - returns an instance of the object - """ - self.spark = spark_session - - def read_data(self, file_path, format, **kwargs) -> DataFrame: - """ - Read a Spark DataFrame - - Parameters - ---------- - file_path : str - File path - format: str - name of the file format, e.g. 'csv', 'parquet'. - **kwargs: - Additional reading options passed to `options()`. - Returns - ------- - pyspark.sql.DataFrame - """ - return self.spark.read.format(format).options(**kwargs).load(file_path) - - def write_data(self, df, save_path, format, mode, partitions=None) -> None: - """ - Save a Spark DataFrame - - Parameters - ---------- - save_path : str - Destination path - format : str - name of the destination file format, e.g. 'csv', 'parquet'. - mode : str - specify the mode of writing data, if data already exist in the designed path - * append: Append the contents of the DataFrame to the existing data - * overwrite: Overwrite existing data - * ignore: Silently ignores this operation - * error or errorifexists (default case): Raises an error - partitions : int - number of partitions desired in output files. If greater than `df`'s partitions, `rapartition()` will be used. - Else, `coalesce()` will be used. - - Returns - ------- - self: - returns an instance of the object - """ - if partitions: - df_partitions = df.rdd.getNumPartitions() - if df_partitions >= partitions: - df.coalesce(partitions).write.format(format).save(save_path, mode=mode) - else: - df.repartition(partitions).write.format(format).save(save_path, mode=mode) - else: - df.write.format(format).save(save_path, mode=mode) diff --git a/rony/module_templates/spark/main.py b/rony/module_templates/spark/main.py deleted file mode 100644 index 3495e42..0000000 --- a/rony/module_templates/spark/main.py +++ /dev/null @@ -1,13 +0,0 @@ -from pyspark.sql import SparkSession -from processing import SparkCleaner - -if __name__ == "__main__": - spark = ( - SparkSession - .builder - .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") - .getOrCreate() - ) - cleaner = SparkCleaner(spark) - cleaner.clean() - spark.stop() \ No newline at end of file diff --git a/rony/module_templates/spark/processing.py b/rony/module_templates/spark/processing.py deleted file mode 100644 index 1ea254d..0000000 --- a/rony/module_templates/spark/processing.py +++ /dev/null @@ -1,128 +0,0 @@ -import pyspark.sql.functions as f -from pyspark.sql.window import Window -from data_source import FlatFile -from spark_utils import unidecode_udf, convert_decimal_udf - -FILE_PATHS = { - 'data': 'path/to/file' -} - -class SparkCleaner: - """ - Class used to clean perform basic cleaning with Spark - """ - - def __init__(self, spark_session) -> None: - """ - Instantiates class - - Parameters - ---------- - spark_session : pyspark.sql.session.SparkSession - SparkSession that is used to manipulate data. - - Returns - ------- - self: - returns an instance of the object - """ - self.spark = spark_session - self.ff_source = FlatFile(spark_session) - self.read_options = {} - self.save_path = 'destination/path' - - def read_data(self, format) -> None: - """ - Reads raw data for cleaning. - - Parameters - ---------- - format : str - name of the destination file format, e.g. 'csv', 'parquet'. - - Returns - ------- - self: - returns an instance of the object - """ - self.df = self.ff_source.read_data(FILE_PATHS['data'], format, **self.read_options) - - def clean_types(self) -> None: - """ - Cleans DataFrame column types. - - Parameters - ---------- - None - - Returns - ------- - self: - returns an instance of the object - """ - str_cols = [] - for c in str_cols: - self.df = self.df.withColumn(c, unidecode_udf(f.initcap(f.trim(c)))) - - dbl_cols = [] - for c in dbl_cols: - self.df = self.df.withColumn(c, convert_decimal_udf(f.col(c))) - - date_cols = [] - for c in date_cols: - self.df = self.df.withColumn(c, f.to_date(c, 'dd/MM/yyyy')) - - def clean_specific(self) -> None: - """ - Performs cleaning operations specific to this DataFrame. - - Parameters - ---------- - None - - Returns - ------- - self: - returns an instance of the object - """ - self.df_cleaned = self.df - - def write_data(self, format, mode='error') -> None: - """ - Saves intermediate DataFrames generated in this process. - - Parameters - ---------- - format : str - name of the destination file format, e.g. 'csv', 'parquet'. - mode : str - specify the mode of writing data, if data already exist in the designed path - * append: Append the contents of the DataFrame to the existing data - * overwrite: Overwrite existing data - * ignore: Silently ignores this operation - * error or errorifexists (default case): Raises an error - - Returns - ------- - self: - returns an instance of the object - """ - self.ff_source.write_data(self.df_cleaned, self.save_path, format, mode) - - def clean(self) -> None: - """ - Wrapper for running cleaner. - - Parameters - ---------- - None - - Returns - ------- - self: - returns an instance of the object - """ - self.read_data('csv') - self.clean_types() - self.clean_specific() - self.write_data('parquet') \ No newline at end of file diff --git a/rony/module_templates/spark/spark_utils.py b/rony/module_templates/spark/spark_utils.py deleted file mode 100644 index 52bfa4d..0000000 --- a/rony/module_templates/spark/spark_utils.py +++ /dev/null @@ -1,98 +0,0 @@ -import pyspark.sql.functions as f -import pyspark.sql.types as t -from pyspark.sql.dataframe import DataFrame -from unidecode import unidecode -import numpy as np -import os -import re - -def get_spark_versions() -> 'list[str]': - spark_home = os.environ['SPARK_HOME'] - spark_version = re.search('(?<=spark-).+(?=-bin)', spark_home).group(0) - hadoop_version = re.search('(?<=hadoop).+', spark_home).group(0) - return (spark_version, hadoop_version) - -spark_version, hadoop_version = get_spark_versions() - -if int(spark_version[0]) < 3: - def transform(self, f) -> DataFrame: - return f(self) - - DataFrame.transform = transform - -# UDFs - -@f.udf(returnType=t.StringType()) -def unidecode_udf(string): - if not string: - return None - else: - return unidecode(string) - -@f.udf(returnType=t.DoubleType()) -def convert_decimal_udf(string): - if string is None: - return None - else: - string = string.replace(",", ".") - return float(string.replace(".", "", string.count(".") - 1)) - -@f.udf(returnType=t.FloatType()) -def array_product_udf(array): - if not array: - return None - else: - array = [e for e in array if e is not None] - return float(np.prod(array)) - - -@f.udf(returnType=t.FloatType()) -def array_sum_udf(array): - if not array: - return None - else: - array = [e for e in array if e is not None] - return sum(array) - - -# Custom methods - -def df_from_struct(cols, extract_col, explode) -> DataFrame: - def _(df): - if explode: - df = df.withColumn(extract_col, f.explode(extract_col)) - struct_cols = df.select(f'{extract_col}.*').columns - renamed_cols = [] - for c in struct_cols: - col_ref = f.col(f'{extract_col}.' + c) - if c in cols: - renamed_cols.append(col_ref.alias(c + '_struct')) - else: - renamed_cols.append(col_ref) - return df.select(*cols, *renamed_cols) - return _ - -def renamer(dict) -> DataFrame: - def _(df): - for c, n in dict.items(): - df = df.withColumnRenamed(c, n) - return df - return _ - - -def unpivot(*args, col_name="categorias", value_name="valor") -> DataFrame: - if not args[0]: - key_cols = [] - else: - key_cols = args[0] if type(args[0]) is list else args - - def _(df): - unpivot_cols = [c for c in df.columns if c not in key_cols] - groups_str = [f"'{i}', `{i}`" for i in unpivot_cols] - unpivot_string = ", ".join(groups_str) - unpivot_query = "stack({}, {}) as ({}, {})".format( - len(unpivot_cols), unpivot_string, col_name, value_name - ) - return df.selectExpr(*key_cols, unpivot_query) - - return _ \ No newline at end of file From 4984fef2c56c912c57fc35dae2ca99175eb02a71 Mon Sep 17 00:00:00 2001 From: pltoledo Date: Thu, 2 Sep 2021 19:51:09 -0300 Subject: [PATCH 08/25] fix: structure module and add dependencie in module .json --- .../spark/spark/data_source.py | 75 ++++++++++ rony/module_templates/spark/spark/main.py | 13 ++ .../spark/spark/processing.py | 128 ++++++++++++++++++ .../spark/spark/spark_utils.py | 98 ++++++++++++++ 4 files changed, 314 insertions(+) create mode 100644 rony/module_templates/spark/spark/data_source.py create mode 100644 rony/module_templates/spark/spark/main.py create mode 100644 rony/module_templates/spark/spark/processing.py create mode 100644 rony/module_templates/spark/spark/spark_utils.py diff --git a/rony/module_templates/spark/spark/data_source.py b/rony/module_templates/spark/spark/data_source.py new file mode 100644 index 0000000..851f263 --- /dev/null +++ b/rony/module_templates/spark/spark/data_source.py @@ -0,0 +1,75 @@ +from pyspark.sql.dataframe import DataFrame + + +class FlatFile: + """ + Class for reading files with Spark + """ + + def __init__(self, spark_session) -> None: + """ + Instantiate class + + Parameters + ---------- + spark_session : pyspark.sql.session.SparkSession + SparkSession used to read data + + Returns + ------- + self: + returns an instance of the object + """ + self.spark = spark_session + + def read_data(self, file_path, format, **kwargs) -> DataFrame: + """ + Read a Spark DataFrame + + Parameters + ---------- + file_path : str + File path + format: str + name of the file format, e.g. 'csv', 'parquet'. + **kwargs: + Additional reading options passed to `options()`. + Returns + ------- + pyspark.sql.DataFrame + """ + return self.spark.read.format(format).options(**kwargs).load(file_path) + + def write_data(self, df, save_path, format, mode, partitions=None) -> None: + """ + Save a Spark DataFrame + + Parameters + ---------- + save_path : str + Destination path + format : str + name of the destination file format, e.g. 'csv', 'parquet'. + mode : str + specify the mode of writing data, if data already exist in the designed path + * append: Append the contents of the DataFrame to the existing data + * overwrite: Overwrite existing data + * ignore: Silently ignores this operation + * error or errorifexists (default case): Raises an error + partitions : int + number of partitions desired in output files. If greater than `df`'s partitions, `rapartition()` will be used. + Else, `coalesce()` will be used. + + Returns + ------- + self: + returns an instance of the object + """ + if partitions: + df_partitions = df.rdd.getNumPartitions() + if df_partitions >= partitions: + df.coalesce(partitions).write.format(format).save(save_path, mode=mode) + else: + df.repartition(partitions).write.format(format).save(save_path, mode=mode) + else: + df.write.format(format).save(save_path, mode=mode) diff --git a/rony/module_templates/spark/spark/main.py b/rony/module_templates/spark/spark/main.py new file mode 100644 index 0000000..3495e42 --- /dev/null +++ b/rony/module_templates/spark/spark/main.py @@ -0,0 +1,13 @@ +from pyspark.sql import SparkSession +from processing import SparkCleaner + +if __name__ == "__main__": + spark = ( + SparkSession + .builder + .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") + .getOrCreate() + ) + cleaner = SparkCleaner(spark) + cleaner.clean() + spark.stop() \ No newline at end of file diff --git a/rony/module_templates/spark/spark/processing.py b/rony/module_templates/spark/spark/processing.py new file mode 100644 index 0000000..1ea254d --- /dev/null +++ b/rony/module_templates/spark/spark/processing.py @@ -0,0 +1,128 @@ +import pyspark.sql.functions as f +from pyspark.sql.window import Window +from data_source import FlatFile +from spark_utils import unidecode_udf, convert_decimal_udf + +FILE_PATHS = { + 'data': 'path/to/file' +} + +class SparkCleaner: + """ + Class used to clean perform basic cleaning with Spark + """ + + def __init__(self, spark_session) -> None: + """ + Instantiates class + + Parameters + ---------- + spark_session : pyspark.sql.session.SparkSession + SparkSession that is used to manipulate data. + + Returns + ------- + self: + returns an instance of the object + """ + self.spark = spark_session + self.ff_source = FlatFile(spark_session) + self.read_options = {} + self.save_path = 'destination/path' + + def read_data(self, format) -> None: + """ + Reads raw data for cleaning. + + Parameters + ---------- + format : str + name of the destination file format, e.g. 'csv', 'parquet'. + + Returns + ------- + self: + returns an instance of the object + """ + self.df = self.ff_source.read_data(FILE_PATHS['data'], format, **self.read_options) + + def clean_types(self) -> None: + """ + Cleans DataFrame column types. + + Parameters + ---------- + None + + Returns + ------- + self: + returns an instance of the object + """ + str_cols = [] + for c in str_cols: + self.df = self.df.withColumn(c, unidecode_udf(f.initcap(f.trim(c)))) + + dbl_cols = [] + for c in dbl_cols: + self.df = self.df.withColumn(c, convert_decimal_udf(f.col(c))) + + date_cols = [] + for c in date_cols: + self.df = self.df.withColumn(c, f.to_date(c, 'dd/MM/yyyy')) + + def clean_specific(self) -> None: + """ + Performs cleaning operations specific to this DataFrame. + + Parameters + ---------- + None + + Returns + ------- + self: + returns an instance of the object + """ + self.df_cleaned = self.df + + def write_data(self, format, mode='error') -> None: + """ + Saves intermediate DataFrames generated in this process. + + Parameters + ---------- + format : str + name of the destination file format, e.g. 'csv', 'parquet'. + mode : str + specify the mode of writing data, if data already exist in the designed path + * append: Append the contents of the DataFrame to the existing data + * overwrite: Overwrite existing data + * ignore: Silently ignores this operation + * error or errorifexists (default case): Raises an error + + Returns + ------- + self: + returns an instance of the object + """ + self.ff_source.write_data(self.df_cleaned, self.save_path, format, mode) + + def clean(self) -> None: + """ + Wrapper for running cleaner. + + Parameters + ---------- + None + + Returns + ------- + self: + returns an instance of the object + """ + self.read_data('csv') + self.clean_types() + self.clean_specific() + self.write_data('parquet') \ No newline at end of file diff --git a/rony/module_templates/spark/spark/spark_utils.py b/rony/module_templates/spark/spark/spark_utils.py new file mode 100644 index 0000000..52bfa4d --- /dev/null +++ b/rony/module_templates/spark/spark/spark_utils.py @@ -0,0 +1,98 @@ +import pyspark.sql.functions as f +import pyspark.sql.types as t +from pyspark.sql.dataframe import DataFrame +from unidecode import unidecode +import numpy as np +import os +import re + +def get_spark_versions() -> 'list[str]': + spark_home = os.environ['SPARK_HOME'] + spark_version = re.search('(?<=spark-).+(?=-bin)', spark_home).group(0) + hadoop_version = re.search('(?<=hadoop).+', spark_home).group(0) + return (spark_version, hadoop_version) + +spark_version, hadoop_version = get_spark_versions() + +if int(spark_version[0]) < 3: + def transform(self, f) -> DataFrame: + return f(self) + + DataFrame.transform = transform + +# UDFs + +@f.udf(returnType=t.StringType()) +def unidecode_udf(string): + if not string: + return None + else: + return unidecode(string) + +@f.udf(returnType=t.DoubleType()) +def convert_decimal_udf(string): + if string is None: + return None + else: + string = string.replace(",", ".") + return float(string.replace(".", "", string.count(".") - 1)) + +@f.udf(returnType=t.FloatType()) +def array_product_udf(array): + if not array: + return None + else: + array = [e for e in array if e is not None] + return float(np.prod(array)) + + +@f.udf(returnType=t.FloatType()) +def array_sum_udf(array): + if not array: + return None + else: + array = [e for e in array if e is not None] + return sum(array) + + +# Custom methods + +def df_from_struct(cols, extract_col, explode) -> DataFrame: + def _(df): + if explode: + df = df.withColumn(extract_col, f.explode(extract_col)) + struct_cols = df.select(f'{extract_col}.*').columns + renamed_cols = [] + for c in struct_cols: + col_ref = f.col(f'{extract_col}.' + c) + if c in cols: + renamed_cols.append(col_ref.alias(c + '_struct')) + else: + renamed_cols.append(col_ref) + return df.select(*cols, *renamed_cols) + return _ + +def renamer(dict) -> DataFrame: + def _(df): + for c, n in dict.items(): + df = df.withColumnRenamed(c, n) + return df + return _ + + +def unpivot(*args, col_name="categorias", value_name="valor") -> DataFrame: + if not args[0]: + key_cols = [] + else: + key_cols = args[0] if type(args[0]) is list else args + + def _(df): + unpivot_cols = [c for c in df.columns if c not in key_cols] + groups_str = [f"'{i}', `{i}`" for i in unpivot_cols] + unpivot_string = ", ".join(groups_str) + unpivot_query = "stack({}, {}) as ({}, {})".format( + len(unpivot_cols), unpivot_string, col_name, value_name + ) + return df.selectExpr(*key_cols, unpivot_query) + + return _ \ No newline at end of file From 5c9ac38064413d71b4df29fd129d75238f95184b Mon Sep 17 00:00:00 2001 From: RodrigoATorres Date: Sat, 23 Oct 2021 17:45:14 -0300 Subject: [PATCH 09/25] Update ChangeLog.md --- docs/ChangeLog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md index 973c800..39ea991 100644 --- a/docs/ChangeLog.md +++ b/docs/ChangeLog.md @@ -7,6 +7,8 @@ - Fixes on diif-2-module function - Added dependencies field to json file created - Fixed issue that would not add new files to created module +- Added spark scripts module + ## Version 0.3.1 From 29d9533d6d0c524c047ef973820db4a78504b14f Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Tue, 16 Nov 2021 21:51:54 -0300 Subject: [PATCH 10/25] feat/data-quality - first commit --- rony/module_templates/data_quality.json | 15 +++++++++++++++ rony/module_templates/data_quality/__init__.py | 0 2 files changed, 15 insertions(+) create mode 100644 rony/module_templates/data_quality.json create mode 100644 rony/module_templates/data_quality/__init__.py diff --git a/rony/module_templates/data_quality.json b/rony/module_templates/data_quality.json new file mode 100644 index 0000000..21cff58 --- /dev/null +++ b/rony/module_templates/data_quality.json @@ -0,0 +1,15 @@ +{ + "info": "Module with Classes for Data Quality jobs using Spark and AWS PyDeequ", + "instructions": [ + "This module has a dependency with pydeequ library. It should be installed on running clusters or servers.", + + ], + "developers": [ + "neylson.crepalde@a3data.com.br" + ], + "input_info": [], + "version": "0.0.1", + "dependencies": [ + "CI_workflows" + ] +} \ No newline at end of file diff --git a/rony/module_templates/data_quality/__init__.py b/rony/module_templates/data_quality/__init__.py new file mode 100644 index 0000000..e69de29 From 0c3bb42137a3e57741effd67a424267bc807b648 Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Tue, 23 Nov 2021 08:21:06 -0300 Subject: [PATCH 11/25] first DataQuality abstract Class --- .gitignore | 5 ++- .../data_quality/data_quality.py | 31 ++++++++++++++++++ .../img/Rony-data-quality-classes-diagram.png | Bin 0 -> 95428 bytes 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 rony/module_templates/data_quality/data_quality.py create mode 100644 rony/module_templates/data_quality/img/Rony-data-quality-classes-diagram.png diff --git a/.gitignore b/.gitignore index 1c2f86e..f994b42 100644 --- a/.gitignore +++ b/.gitignore @@ -132,4 +132,7 @@ dmypy.json *_env/ -ci-test/ \ No newline at end of file +ci-test/ + +.DS_Store + diff --git a/rony/module_templates/data_quality/data_quality.py b/rony/module_templates/data_quality/data_quality.py new file mode 100644 index 0000000..c3f24ac --- /dev/null +++ b/rony/module_templates/data_quality/data_quality.py @@ -0,0 +1,31 @@ +from abc import ABC, abstractmethod +from pyspark.sql import SparkSession + + +class DataQuality(ABC): + """ + Abstract DataQuality Class + """ + + @abstractmethod + def __init__(self, spark: SparkSession) -> None: + self.spark = spark + + + @abstractmethod + def write_output(self, dataframe: bool = True) -> None: + """ + Write output for DataQuality process. + + Parameters + ---------- + + dataframe: bool = True + if True, results are returned as a spark DataFrame. If False, + results are returned as a dict object. + """ + if dataframe: + pass + else: + pass + diff --git a/rony/module_templates/data_quality/img/Rony-data-quality-classes-diagram.png b/rony/module_templates/data_quality/img/Rony-data-quality-classes-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..efa35ec35f2a5b8159e50ddbe4d222f0b1fe6de2 GIT binary patch literal 95428 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ȖQK5mUF!eky#T9NQ6BBPWk*EQYA54 z%!bwfHB7lNaaO7*LKS*!`=++z(7ismlKrJ!$p*-7e&%) z+6?J<8uShqnIm*O;ZS}B^X@N90g}Xg{?zJsTVdH*3hH=6nh)AFcdv(j)Winkl%8R_ zJ{ED!Dg_{5*{r*5RB z1*Y$%n?jG%C-S+yMhuDYi0&fbgM`MR92v8T5Nj`OUxv;3a>OLq-LJk`z083UI$w?9 zN%yfCb&8J3_rY4poC=MK^m|Wq`a%qf{oI(fYXY`PF-9{CvfS9TVOd8f7Xbp2PPcK8 z1d|xl8R9?9&zsp4bA1Bwqkfli2-Go#>!{y7H=}sBVNX*o@H-ewd@5akjZAmQIfqF; z%+rap6{RgUvyuuz4c22e7Whdj0O{mm<%mn0;Fb}4tL(zpLq|(E5VN(9*|eP*sS7b6 z1?TG=vmfn7TuGoLfi_&%Cnv#dO<`<5;S>89=i#Hf5u2;v!fqiD(pqI+Jj`@YXbaWr zM(vY-IGih8Po{&>mg|%;uJB;9k=~VgG=wyeyjOXZg)_dDXhOK&{QWG2V zB4cb7+xm4J6$S+eo}jM?W^8x&YKHcN6l|%$-KZBD)vyu5+ex_akRMFoOw%VZ>@q+9)GIW0Ntbcs^L7gt)cg0EcFI;3yGU~=y2uH z5yaSzAzXig8IZp20XWivB@qSo>lW}J9e5(irN7OS#ruW{Wh6=U)v$mRWk2&HuFUW+ z;8yz+cvXTg$(~MFu7DSKbJ5mFg)t79;lodPtUn5`s1>xH{K<(rQ$EZ)x zf0O?#;7ElH+P`^hziJGqOC&IywW{($_Rq)tZ^sh`;G5-j_P^0G!209>eDA8!3H$sW z>#qZj!x(7Do(jJf$=@Fcw1uI_7^9Xq|Hjw=oPaTm&*h{4dhC9W;lLj}f7O;bk7$0) z$*e)*V-4Fa}-sCffg=D+dhc_msR({&kqY z2JQ#OU~K-*%B)4U6UJ1LWVzJx(>Ua+@CGR1q1GPd}e*XmMb*ruqq*$)~ z`0#UQlgC~gPZ7%ePP^(|FNyt##b!cseAj=9W>CQ<`RV1)o5SmKJ*LLDFtkS|qgUQk3E`2(i_cS@%n@>Gu{(UiAhwg(}BOHw^f{`m_ zg|*rP|F9W&OQj5e;Wo%@l{UDeq;*$VCjPocfOI4s0+uSc?=a?OU;ttxy?+4rMSI*Z z3~7VNsuW~#mBH?I&>v|*`|DeG;3LrjJAxw7yMA7sgJj-sEix4r5FY3?MKrmThA1)& z0{(mijYIB45>Ga_3jh35=0W?n7Ht0jV}EJ4-z{0ZH!wElZQcugFYvA8&-FmRUk50H zlol5=JJ%Ainihlo`Epc++j>JjZa4_%(RYgf9sDCa-~F*pye{LWFV>0~qSkaEKATd} z(0iH>n1quc?6^|W+f;t24wsrGcslW%>F33uK$JJO8ZU&v>NB^Xij+BK^lY>k@6V)v z21P!k>!E}3khGDSj;4{N?lU82D*=w`6)4Mk$wv+kzRPRCp$wim#kRgz-0?uO)23>6 zijgtaaR~}2qA|Op1txMF$;J(1N=X7IrJll=%t%y)MlbcNb*yPa_pXtrCfe-PJ_)Bz zbCj}8wesBRrf$A_WC9-E{#x#@_h1hJ8Jg?Ca+m5^%8$m;i?{#VS;&SFFVwArurQ}s zFYGRj*X^UZZ9QHYjdxyX*lGJWxaj7DKC@_gHN7<%))g{w1jCE2Q0@^q$S9?LwQ8jJC02nvkoT89U2FuG1j{I+?`e>47rOyS0bN9A$E< z9N8D#HXUqfV=!sy-RfhWpN!1$nw{BQbk(!-H0b&Kk3r+S0f;dmbzL}xQCE0w7ilU- zA8q)KTwe`dGdYC_<(aBqU3%_RwLN@xHHE7dx!bBxHm?mmU&NYS?Nu0O5ZI~h_rZPk zLE&D;Is&c0PGx_bSyt+>Nw+|glXHw^tK|{hS@+CIUge*5V^lGl}fKfaxmVrX1(wJiC0 zFPaRd&Sq=gHYlduB(QuqyQ6xwysB8Er#?A~#CXqWV9GC{%CPh83nkl4XGR_~=TRc% z551h+oqop*q(`5eFK{Po=5`7WM=n7@{QPucrH&P=n9>)&l8|y!y|h*PWGe(~GT*_p z^sw@{ux<)B?s8|_%x|hdK14uHh1+~mv;Xqp<@{yX%-Y_H$oNCnXToxpjh5MpTs4+k zbJb(ZU|X_bV?+5T+uSDC1s;xdikrF1-LXO|wkz!n;G z#+he2lhm5c&UcT!z~zm6c_~1rS>Qu+sS}E^pyo8aZKF3TcE!@my&pJiV*btPcANEN zVK87q%*;_2k51`ubBENi>Y3(6SdMZ{=R)rbo97x!m3IaeEUs~$-}$|zz}6(KHnjA) zbkhqg&QF_B@;amreR@u>r-kp;P3kKeRC-2jNM8ZwDz87AEJ;4O4UV3=lUEVpQ>4Il(Uoy zlC6y$%4;~5t>ZEhXvjOiNN;0E7>?`o%GxvswHZ9P{Ll|iw-gI+X?`wRda)YkXr63S zQ+Jw|!MLh6*7VqU{;tD93+r|cR$Z}8noVg(Ud@t`AHDf8`-kDns*%>zS!faC6wsXT zPly-x5LK8yiVVn(#n7!juiGyjfqb`mos`9sTf1F)xx>)jKZYc?b3FbyCwllR-s@pp zQY06qSRG>>*gS#$!8%0DeU$*O^eQeXU=C9(HZz2S~-ls<#_w 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 P_(xe$RpF_ek?;QkDu{SD literal 0 HcmV?d00001 From 4cb32da113738a7394d9022ffae5a40fc4e8c058 Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Tue, 23 Nov 2021 08:29:52 -0300 Subject: [PATCH 12/25] insert run abstractmethod in DataQuality class --- rony/module_templates/data_quality/data_quality.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rony/module_templates/data_quality/data_quality.py b/rony/module_templates/data_quality/data_quality.py index c3f24ac..ad5c504 100644 --- a/rony/module_templates/data_quality/data_quality.py +++ b/rony/module_templates/data_quality/data_quality.py @@ -12,6 +12,14 @@ def __init__(self, spark: SparkSession) -> None: self.spark = spark + @abstractmethod + def run(self) -> None: + """ + Run the DataQuality process + """ + pass + + @abstractmethod def write_output(self, dataframe: bool = True) -> None: """ From f318f10acc0058f769030553e47026c01b079462 Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Tue, 23 Nov 2021 08:41:47 -0300 Subject: [PATCH 13/25] =?UTF-8?q?constroi=20DataQuality=20como=20um=20m?= =?UTF-8?q?=C3=B3dulo=20da=20biblioteca=20Rony,=20n=C3=A3o=20como=20gerado?= =?UTF-8?q?r=20de=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Rony-data-quality-classes-diagram.png | Bin rony/__init__.py | 1 + rony/data_quality/__init__.py | 1 + .../data_quality/data_quality.py | 0 rony/data_quality/profiler.py | 32 ++++++++++++++++++ rony/module_templates/data_quality.json | 15 -------- .../module_templates/data_quality/__init__.py | 0 7 files changed, 34 insertions(+), 15 deletions(-) rename {rony/module_templates/data_quality/img => img}/Rony-data-quality-classes-diagram.png (100%) create mode 100644 rony/data_quality/__init__.py rename rony/{module_templates => }/data_quality/data_quality.py (100%) create mode 100644 rony/data_quality/profiler.py delete mode 100644 rony/module_templates/data_quality.json delete mode 100644 rony/module_templates/data_quality/__init__.py diff --git a/rony/module_templates/data_quality/img/Rony-data-quality-classes-diagram.png b/img/Rony-data-quality-classes-diagram.png similarity index 100% rename from rony/module_templates/data_quality/img/Rony-data-quality-classes-diagram.png rename to img/Rony-data-quality-classes-diagram.png diff --git a/rony/__init__.py b/rony/__init__.py index 683640d..a0143ff 100644 --- a/rony/__init__.py +++ b/rony/__init__.py @@ -1,3 +1,4 @@ from .cli import * from ._version import __version__ +from data_quality import * __author__ = 'A3Data' \ No newline at end of file diff --git a/rony/data_quality/__init__.py b/rony/data_quality/__init__.py new file mode 100644 index 0000000..e94810e --- /dev/null +++ b/rony/data_quality/__init__.py @@ -0,0 +1 @@ +from .profiler import Profiler \ No newline at end of file diff --git a/rony/module_templates/data_quality/data_quality.py b/rony/data_quality/data_quality.py similarity index 100% rename from rony/module_templates/data_quality/data_quality.py rename to rony/data_quality/data_quality.py diff --git a/rony/data_quality/profiler.py b/rony/data_quality/profiler.py new file mode 100644 index 0000000..bc96fa0 --- /dev/null +++ b/rony/data_quality/profiler.py @@ -0,0 +1,32 @@ +from .data_quality import DataQuality +from pyspark.sql import SparkSession + + +class Profiler(DataQuality): + """ + Abstract DataQuality Class + """ + + def run(self) -> None: + """ + Run the DataQuality process + """ + pass + + + def write_output(self, dataframe: bool = True) -> None: + """ + Write output for DataQuality process. + + Parameters + ---------- + + dataframe: bool = True + if True, results are returned as a spark DataFrame. If False, + results are returned as a dict object. + """ + if dataframe: + pass + else: + pass + diff --git a/rony/module_templates/data_quality.json b/rony/module_templates/data_quality.json deleted file mode 100644 index 21cff58..0000000 --- a/rony/module_templates/data_quality.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "info": "Module with Classes for Data Quality jobs using Spark and AWS PyDeequ", - "instructions": [ - "This module has a dependency with pydeequ library. It should be installed on running clusters or servers.", - - ], - "developers": [ - "neylson.crepalde@a3data.com.br" - ], - "input_info": [], - "version": "0.0.1", - "dependencies": [ - "CI_workflows" - ] -} \ No newline at end of file diff --git a/rony/module_templates/data_quality/__init__.py b/rony/module_templates/data_quality/__init__.py deleted file mode 100644 index e69de29..0000000 From c2cb7f4b61d0607d61a0586062b2b017ba3643ac Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Tue, 23 Nov 2021 21:08:53 -0300 Subject: [PATCH 14/25] improve DataQuality abstract class --- rony/data_quality/data_quality.py | 47 ++++++++++++++++++++++++------- rony/data_quality/profiler.py | 10 +++++-- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/rony/data_quality/data_quality.py b/rony/data_quality/data_quality.py index ad5c504..c0acea1 100644 --- a/rony/data_quality/data_quality.py +++ b/rony/data_quality/data_quality.py @@ -1,10 +1,15 @@ from abc import ABC, abstractmethod -from pyspark.sql import SparkSession +from pyspark.sql import SparkSession, DataFrame class DataQuality(ABC): """ Abstract DataQuality Class + + Parameters + ---------- + spark: SparkSession + A SparkSession object to run DataQuality jobs. """ @abstractmethod @@ -13,27 +18,49 @@ def __init__(self, spark: SparkSession) -> None: @abstractmethod - def run(self) -> None: + def run(self, df: DataFrame) -> DataFrame: """ Run the DataQuality process + + Parameters + ---------- + + df: DataFrame + A Spark DataFrame to run DataQuality jobs. + + Returns + ------- + + DataFrame -> A DataFrame with the results for DataQuality job. """ pass @abstractmethod - def write_output(self, dataframe: bool = True) -> None: + def write_output(self, df: DataFrame, path: str, + delta: bool = True) -> None: """ Write output for DataQuality process. Parameters ---------- - - dataframe: bool = True - if True, results are returned as a spark DataFrame. If False, - results are returned as a dict object. + df: DataFrame + The DataFrame object to write to an external object storage + path: str + The path to write the results. Usually, an S3/GCS/Blob Storage + path + delta: bool + If True, write a delta table on specified path. If False, write a + simple parquet file. """ - if dataframe: - pass + if delta: + output_format = "delta" else: - pass + output_format = "parquet" + + ( + df.write + .format(output_format) + .save(path) + ) diff --git a/rony/data_quality/profiler.py b/rony/data_quality/profiler.py index bc96fa0..6bb5ca9 100644 --- a/rony/data_quality/profiler.py +++ b/rony/data_quality/profiler.py @@ -1,13 +1,19 @@ from .data_quality import DataQuality -from pyspark.sql import SparkSession +from pyspark.sql import DataFramen class Profiler(DataQuality): """ Abstract DataQuality Class + + Parameters + ---------- + spark: SparkSession + A SparkSession object to run DataQuality jobs. + """ - def run(self) -> None: + def run(self, df: DataFrame) -> None: """ Run the DataQuality process """ From 73207d4096a8ae9e2e5a2247d84e27d735d56455 Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Tue, 23 Nov 2021 21:30:32 -0300 Subject: [PATCH 15/25] hard coded initial Analyzer run --- rony/data_quality/analyzer.py | 80 +++++++++++++++++++++++++++++++ rony/data_quality/data_quality.py | 12 +---- rony/data_quality/profiler.py | 45 ++++++++++++----- 3 files changed, 115 insertions(+), 22 deletions(-) create mode 100644 rony/data_quality/analyzer.py diff --git a/rony/data_quality/analyzer.py b/rony/data_quality/analyzer.py new file mode 100644 index 0000000..c9522e8 --- /dev/null +++ b/rony/data_quality/analyzer.py @@ -0,0 +1,80 @@ +from pyspark.sql.dataframe import DataFrame +from .data_quality import DataQuality +from pyspark.sql import DataFrame +from pydeequ.analyzers import ( + AnalysisRunner, AnalyzerContext, Size, Completeness, Mean, + Correlation, ApproxCountDistinct +) + + +class Analyzer(DataQuality): + """ + Abstract DataQuality Class + + Parameters + ---------- + spark: SparkSession + A SparkSession object to run DataQuality jobs. + + """ + + def run(self, df: DataFrame) -> DataFrame: + """ + Run the DataQuality job + + Parameters + ---------- + + df: DataFrame + A Spark DataFrame to run DataQuality jobs. + + Returns + ------- + + DataFrame -> A DataFrame with the results for DataQuality job. + """ + analysisResult = ( + AnalysisRunner(self.spark) + .onData(df) + .addAnalyzer(Size()) + .addAnalyzer(Completeness("PassengerId")) + .addAnalyzer(ApproxCountDistinct("Pclass")) + .addAnalyzer(Mean("Age")) + .addAnalyzer(Correlation("Age", "Fare")) + .run() + ) + + analysisResult_df = ( + AnalyzerContext + .successMetricsAsDataFrame(self.spark, analysisResult) + ) + return analysisResult_df + + + def write_output(self, df: DataFrame, path: str, + delta: bool = True) -> None: + """ + Write output for DataQuality process. + + Parameters + ---------- + df: DataFrame + The DataFrame object to write to an external object storage + path: str + The path to write the results. Usually, an S3/GCS/Blob Storage + path + delta: bool + If True, write a delta table on specified path. If False, write a + simple parquet file. + """ + if delta: + output_format = "delta" + else: + output_format = "parquet" + + ( + df.write + .format(output_format) + .save(path) + ) + diff --git a/rony/data_quality/data_quality.py b/rony/data_quality/data_quality.py index c0acea1..acea9c1 100644 --- a/rony/data_quality/data_quality.py +++ b/rony/data_quality/data_quality.py @@ -53,14 +53,4 @@ def write_output(self, df: DataFrame, path: str, If True, write a delta table on specified path. If False, write a simple parquet file. """ - if delta: - output_format = "delta" - else: - output_format = "parquet" - - ( - df.write - .format(output_format) - .save(path) - ) - + pass diff --git a/rony/data_quality/profiler.py b/rony/data_quality/profiler.py index 6bb5ca9..43da827 100644 --- a/rony/data_quality/profiler.py +++ b/rony/data_quality/profiler.py @@ -1,5 +1,6 @@ +from pyspark.sql.dataframe import DataFrame from .data_quality import DataQuality -from pyspark.sql import DataFramen +from pyspark.sql import DataFrame class Profiler(DataQuality): @@ -13,26 +14,48 @@ class Profiler(DataQuality): """ - def run(self, df: DataFrame) -> None: + def run(self, df: DataFrame) -> DataFrame: """ - Run the DataQuality process + Run the DataQuality job + + Parameters + ---------- + + df: DataFrame + A Spark DataFrame to run DataQuality jobs. + + Returns + ------- + + DataFrame -> A DataFrame with the results for DataQuality job. """ pass - def write_output(self, dataframe: bool = True) -> None: + def write_output(self, df: DataFrame, path: str, + delta: bool = True) -> None: """ Write output for DataQuality process. Parameters ---------- - - dataframe: bool = True - if True, results are returned as a spark DataFrame. If False, - results are returned as a dict object. + df: DataFrame + The DataFrame object to write to an external object storage + path: str + The path to write the results. Usually, an S3/GCS/Blob Storage + path + delta: bool + If True, write a delta table on specified path. If False, write a + simple parquet file. """ - if dataframe: - pass + if delta: + output_format = "delta" else: - pass + output_format = "parquet" + + ( + df.write + .format(output_format) + .save(path) + ) From aec41bca3fb1d48ef17d898d32f55a22d04a189c Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Tue, 23 Nov 2021 21:54:28 -0300 Subject: [PATCH 16/25] WIP analyzer hard coded example is working --- rony/__init__.py | 4 ++-- rony/data_quality/__init__.py | 3 ++- rony/data_quality/analyzer.py | 7 +++++-- rony/data_quality/profiler.py | 7 +++++-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/rony/__init__.py b/rony/__init__.py index a0143ff..ad74eb0 100644 --- a/rony/__init__.py +++ b/rony/__init__.py @@ -1,4 +1,4 @@ from .cli import * from ._version import __version__ -from data_quality import * -__author__ = 'A3Data' \ No newline at end of file +from .data_quality import * +__author__ = 'A3Data' diff --git a/rony/data_quality/__init__.py b/rony/data_quality/__init__.py index e94810e..41da2d1 100644 --- a/rony/data_quality/__init__.py +++ b/rony/data_quality/__init__.py @@ -1 +1,2 @@ -from .profiler import Profiler \ No newline at end of file +from .profiler import Profiler +from .analyzer import Analyzer diff --git a/rony/data_quality/analyzer.py b/rony/data_quality/analyzer.py index c9522e8..a47eaf6 100644 --- a/rony/data_quality/analyzer.py +++ b/rony/data_quality/analyzer.py @@ -1,6 +1,6 @@ from pyspark.sql.dataframe import DataFrame from .data_quality import DataQuality -from pyspark.sql import DataFrame +from pyspark.sql import SparkSession, DataFrame from pydeequ.analyzers import ( AnalysisRunner, AnalyzerContext, Size, Completeness, Mean, Correlation, ApproxCountDistinct @@ -15,9 +15,12 @@ class Analyzer(DataQuality): ---------- spark: SparkSession A SparkSession object to run DataQuality jobs. - """ + def __init__(self, spark: SparkSession) -> None: + super().__init__(spark) + + def run(self, df: DataFrame) -> DataFrame: """ Run the DataQuality job diff --git a/rony/data_quality/profiler.py b/rony/data_quality/profiler.py index 43da827..fa43327 100644 --- a/rony/data_quality/profiler.py +++ b/rony/data_quality/profiler.py @@ -1,6 +1,6 @@ from pyspark.sql.dataframe import DataFrame from .data_quality import DataQuality -from pyspark.sql import DataFrame +from pyspark.sql import SparkSession, DataFrame class Profiler(DataQuality): @@ -11,9 +11,12 @@ class Profiler(DataQuality): ---------- spark: SparkSession A SparkSession object to run DataQuality jobs. - """ + def __init__(self, spark: SparkSession) -> None: + super().__init__(spark) + + def run(self, df: DataFrame) -> DataFrame: """ Run the DataQuality job From b0c1cc573b36e2b4703e3e69c75821b320cdd9ab Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Tue, 23 Nov 2021 22:37:56 -0300 Subject: [PATCH 17/25] separate DataQuality and DQ AbsClass. Create default SparkSession --- rony/data_quality/__init__.py | 2 + rony/data_quality/analyzer.py | 28 ---------- rony/data_quality/data_quality.py | 89 ++++++++++++++++++++++++++++++- rony/data_quality/profiler.py | 28 ---------- 4 files changed, 89 insertions(+), 58 deletions(-) diff --git a/rony/data_quality/__init__.py b/rony/data_quality/__init__.py index 41da2d1..f7ba861 100644 --- a/rony/data_quality/__init__.py +++ b/rony/data_quality/__init__.py @@ -1,2 +1,4 @@ from .profiler import Profiler from .analyzer import Analyzer +from .data_quality import DataQuality + diff --git a/rony/data_quality/analyzer.py b/rony/data_quality/analyzer.py index a47eaf6..6150e40 100644 --- a/rony/data_quality/analyzer.py +++ b/rony/data_quality/analyzer.py @@ -53,31 +53,3 @@ def run(self, df: DataFrame) -> DataFrame: ) return analysisResult_df - - def write_output(self, df: DataFrame, path: str, - delta: bool = True) -> None: - """ - Write output for DataQuality process. - - Parameters - ---------- - df: DataFrame - The DataFrame object to write to an external object storage - path: str - The path to write the results. Usually, an S3/GCS/Blob Storage - path - delta: bool - If True, write a delta table on specified path. If False, write a - simple parquet file. - """ - if delta: - output_format = "delta" - else: - output_format = "parquet" - - ( - df.write - .format(output_format) - .save(path) - ) - diff --git a/rony/data_quality/data_quality.py b/rony/data_quality/data_quality.py index acea9c1..d1ec08e 100644 --- a/rony/data_quality/data_quality.py +++ b/rony/data_quality/data_quality.py @@ -2,7 +2,7 @@ from pyspark.sql import SparkSession, DataFrame -class DataQuality(ABC): +class DQ(ABC): """ Abstract DataQuality Class @@ -10,11 +10,17 @@ class DataQuality(ABC): ---------- spark: SparkSession A SparkSession object to run DataQuality jobs. + SparkSession must have two configurations: + .config("spark.jars.packages", "com.amazon.deequ:deequ:2.0.0-spark-3.1") + .config("spark.jars.excludes", "net.sourceforge.f2j:arpack_combined_all") """ @abstractmethod def __init__(self, spark: SparkSession) -> None: - self.spark = spark + if isinstance(spark, SparkSession): + self.spark = spark + else: + raise TypeError("spark must be a valid SparkSession object.") @abstractmethod @@ -54,3 +60,82 @@ def write_output(self, df: DataFrame, path: str, simple parquet file. """ pass + + +class DataQuality(DQ): + """ + Base DataQuality Class + + Parameters + ---------- + spark: SparkSession + A SparkSession object to run DataQuality jobs. + SparkSession must have two configurations: + .config("spark.jars.packages", "com.amazon.deequ:deequ:2.0.0-spark-3.1") + .config("spark.jars.excludes", "net.sourceforge.f2j:arpack_combined_all") + """ + + def __init__(self, spark: SparkSession) -> None: + super().__init__(spark) + + + @classmethod + def create_pydeequ_SparkSession(cls) -> SparkSession: + """ + Creates a default SparkSession with PyDeequ jars. + """ + return ( + SparkSession + .builder + .config("spark.jars.packages", "com.amazon.deequ:deequ:2.0.0-spark-3.1") + .config("spark.jars.excludes", "net.sourceforge.f2j:arpack_combined_all") + .getOrCreate() + ) + + + + @classmethod + def create_complete_SparkSession(cls) -> SparkSession: + """ + Creates a SparkSession with PyDeequ and Delta jars + and necessary configurations. + """ + return ( + SparkSession + .builder + .config("spark.jars.packages", "com.amazon.deequ:deequ:2.0.0-spark-3.1,io.delta:delta-core_2.12:1.0.0") + .config("spark.jars.excludes", "net.sourceforge.f2j:arpack_combined_all") + .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") + .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") + .getOrCreate() + ) + + + def write_output(self, df: DataFrame, path: str, mode: str, + delta: bool = True) -> None: + """ + Write output for DataQuality process. + + Parameters + ---------- + df: DataFrame + The DataFrame object to write to an external object storage + path: str + The path to write the results. Usually, an S3/GCS/Blob Storage + path + delta: bool + If True, write a delta table on specified path. If False, write a + simple parquet file. + """ + if delta: + output_format = "delta" + else: + output_format = "parquet" + + ( + df.write + .mode(mode) + .format(output_format) + .save(path) + ) + diff --git a/rony/data_quality/profiler.py b/rony/data_quality/profiler.py index fa43327..5cc0536 100644 --- a/rony/data_quality/profiler.py +++ b/rony/data_quality/profiler.py @@ -34,31 +34,3 @@ def run(self, df: DataFrame) -> DataFrame: """ pass - - def write_output(self, df: DataFrame, path: str, - delta: bool = True) -> None: - """ - Write output for DataQuality process. - - Parameters - ---------- - df: DataFrame - The DataFrame object to write to an external object storage - path: str - The path to write the results. Usually, an S3/GCS/Blob Storage - path - delta: bool - If True, write a delta table on specified path. If False, write a - simple parquet file. - """ - if delta: - output_format = "delta" - else: - output_format = "parquet" - - ( - df.write - .format(output_format) - .save(path) - ) - From 78042a1c00658c21007325dc0d3511c5dc48cdfc Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Tue, 23 Nov 2021 22:55:43 -0300 Subject: [PATCH 18/25] change version to dev .1000 --- rony/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rony/_version.py b/rony/_version.py index e1424ed..17f5211 100644 --- a/rony/_version.py +++ b/rony/_version.py @@ -1 +1 @@ -__version__ = '0.3.1' +__version__ = '0.3.1.1000' From 0250a8e5ab6f942fb28d9b44f00db69a9749655f Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Tue, 23 Nov 2021 23:11:00 -0300 Subject: [PATCH 19/25] update class diagram --- img/Rony-data-quality-classes-diagram.png | Bin 95428 -> 109734 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/Rony-data-quality-classes-diagram.png b/img/Rony-data-quality-classes-diagram.png index efa35ec35f2a5b8159e50ddbe4d222f0b1fe6de2..74393c3317e1434dbe64578bd2c73a14d9ea317b 100644 GIT binary patch literal 109734 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̤% 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ȖQK5mUF!eky#T9NQ6BBPWk*EQYA54 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%0DeU$*O^eQeXU=C9(HZz2S~-ls<#_w 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 P_(xe$RpF_ek?;QkDu{SD From 2840cb656ce3f418d00c40ad54aa8b2220989c8e Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Wed, 24 Nov 2021 22:11:07 -0300 Subject: [PATCH 20/25] Analyzer with config file or string expression working. Only one column methods yet --- rony/data_quality/analyzer.py | 69 ++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/rony/data_quality/analyzer.py b/rony/data_quality/analyzer.py index 6150e40..de00c0b 100644 --- a/rony/data_quality/analyzer.py +++ b/rony/data_quality/analyzer.py @@ -1,9 +1,15 @@ +import json from pyspark.sql.dataframe import DataFrame from .data_quality import DataQuality from pyspark.sql import SparkSession, DataFrame from pydeequ.analyzers import ( - AnalysisRunner, AnalyzerContext, Size, Completeness, Mean, - Correlation, ApproxCountDistinct + AnalysisRunner, AnalyzerContext, + ApproxCountDistinct, ApproxQuantile, ApproxQuantiles, + Completeness, Compliance, Correlation, CountDistinct, + DataType, Distinctness, Entropy, Histogram, KLLParameters, KLLSketch, + Maximum, MaxLength, Mean, Minimum, MinLength, MutualInformation, + PatternMatch, Size, StandardDeviation, Sum, Uniqueness, + UniqueValueRatio ) @@ -21,7 +27,39 @@ def __init__(self, spark: SparkSession) -> None: super().__init__(spark) - def run(self, df: DataFrame) -> DataFrame: + def _analysis_job_builder(self, config_path: str) -> str: + """ + WIP - For now, only works with single column methods. + Build the Analyzer job code as a string expression to be evaluated. + + Parameters + ---------- + config_path: str + Path to a json config file. + Config file should have column names as keys and lists of + analysis methods as values. + + Example: + {"PassengerId": ["Completeness"], + "Age": ["Mean", "StandardDeviation", "Minimum", "Maximum"]} + + Returns + ------- + str -> The AnalysisRunner expression as a str object + """ + with open(config_path, "r") as file: + configurations = json.load(file) + + expression = "AnalysisRunner(spark).onData(df).addAnalyzer(Size())" + + for col in configurations.keys(): + for method in configurations[col]: + expression += ".addAnalyzer(" + method + '("' + col + '"))' + expression += ".run()" + return expression + + + def run(self, df: DataFrame, config: str) -> DataFrame: """ Run the DataQuality job @@ -31,21 +69,26 @@ def run(self, df: DataFrame) -> DataFrame: df: DataFrame A Spark DataFrame to run DataQuality jobs. + config: str + Path to a json config file or a str expression of AnalysisRunner + to evaluate + Returns ------- DataFrame -> A DataFrame with the results for DataQuality job. """ - analysisResult = ( - AnalysisRunner(self.spark) - .onData(df) - .addAnalyzer(Size()) - .addAnalyzer(Completeness("PassengerId")) - .addAnalyzer(ApproxCountDistinct("Pclass")) - .addAnalyzer(Mean("Age")) - .addAnalyzer(Correlation("Age", "Fare")) - .run() - ) + try: + expression = self._analysis_job_builder(config) + except: + expression_start = "AnalysisRunner(spark).onData(df)" + if not config.startswith(expression_start): + raise AttributeError("String expression should start with 'AnalysisRunner(spark).onData(df)'") + else: + expression = config + + spark = self.spark + analysisResult = eval(expression) analysisResult_df = ( AnalyzerContext From 85f5e951b7882819e7cf2626713302a17f6eaf7a Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Mon, 6 Dec 2021 13:24:54 -0300 Subject: [PATCH 21/25] doc(dq) correct parameters on write_file --- rony/data_quality/data_quality.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/rony/data_quality/data_quality.py b/rony/data_quality/data_quality.py index d1ec08e..94d69ca 100644 --- a/rony/data_quality/data_quality.py +++ b/rony/data_quality/data_quality.py @@ -111,8 +111,8 @@ def create_complete_SparkSession(cls) -> SparkSession: ) - def write_output(self, df: DataFrame, path: str, mode: str, - delta: bool = True) -> None: + def write_output(self, df: DataFrame, path: str, + mode: str = "overwrite", delta: bool = True) -> None: """ Write output for DataQuality process. @@ -123,9 +123,12 @@ def write_output(self, df: DataFrame, path: str, mode: str, path: str The path to write the results. Usually, an S3/GCS/Blob Storage path + mode: str + Write mode for parquet or delta table. One of "overwrite", + "append", "error" or "ignore". Defaults to "overwrite". delta: bool If True, write a delta table on specified path. If False, write a - simple parquet file. + simple parquet file. Defaults to True. """ if delta: output_format = "delta" From 97ff29544239cd1b7baebd4e3d98061f15109ddd Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Thu, 31 Mar 2022 14:56:07 -0300 Subject: [PATCH 22/25] change json to yaml --- rony/data_quality/analyzer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rony/data_quality/analyzer.py b/rony/data_quality/analyzer.py index de00c0b..b23676b 100644 --- a/rony/data_quality/analyzer.py +++ b/rony/data_quality/analyzer.py @@ -1,4 +1,4 @@ -import json +import yaml from pyspark.sql.dataframe import DataFrame from .data_quality import DataQuality from pyspark.sql import SparkSession, DataFrame @@ -48,7 +48,7 @@ def _analysis_job_builder(self, config_path: str) -> str: str -> The AnalysisRunner expression as a str object """ with open(config_path, "r") as file: - configurations = json.load(file) + configurations = yaml.full_load(file) expression = "AnalysisRunner(spark).onData(df).addAnalyzer(Size())" From 0b769515e32e24aa04af4711f4c89d3725299e43 Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Thu, 31 Mar 2022 16:58:35 -0300 Subject: [PATCH 23/25] refactor yaml to deal with metrics with 2+ columns --- rony/data_quality/analyzer.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/rony/data_quality/analyzer.py b/rony/data_quality/analyzer.py index b23676b..445d874 100644 --- a/rony/data_quality/analyzer.py +++ b/rony/data_quality/analyzer.py @@ -50,11 +50,21 @@ def _analysis_job_builder(self, config_path: str) -> str: with open(config_path, "r") as file: configurations = yaml.full_load(file) + columnsconfig = configurations["columns"] + metricsconfig = configurations["metrics"] + expression = "AnalysisRunner(spark).onData(df).addAnalyzer(Size())" - for col in configurations.keys(): - for method in configurations[col]: + for col in columnsconfig.keys(): + for method in columnsconfig[col]: expression += ".addAnalyzer(" + method + '("' + col + '"))' + + for method in metricsconfig.keys(): + expression += ".addAnalyzer(" + method + '(' + for col in metricsconfig[method]: + expression += '"' + col + '", ' + expression += '))' + expression += ".run()" return expression From 538cb70bb33dee90deaad5973f96d0738452622e Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Wed, 6 Jul 2022 23:03:15 -0300 Subject: [PATCH 24/25] feat/complete analyzer jobs with all PyDeequ Analyzer methods --- rony/data_quality/analyzer.py | 138 +++++++++++++++++++++++++----- rony/data_quality/data_quality.py | 36 ++++++-- 2 files changed, 145 insertions(+), 29 deletions(-) diff --git a/rony/data_quality/analyzer.py b/rony/data_quality/analyzer.py index 445d874..d2254d7 100644 --- a/rony/data_quality/analyzer.py +++ b/rony/data_quality/analyzer.py @@ -1,7 +1,12 @@ import yaml +from datetime import datetime + from pyspark.sql.dataframe import DataFrame -from .data_quality import DataQuality from pyspark.sql import SparkSession, DataFrame +from pyspark.sql import functions as f + +from .data_quality import DataQuality + from pydeequ.analyzers import ( AnalysisRunner, AnalyzerContext, ApproxCountDistinct, ApproxQuantile, ApproxQuantiles, @@ -15,12 +20,12 @@ class Analyzer(DataQuality): """ - Abstract DataQuality Class + Class for building and running Analyzer jobs and output tables. Parameters ---------- spark: SparkSession - A SparkSession object to run DataQuality jobs. + A SparkSession object """ def __init__(self, spark: SparkSession) -> None: @@ -29,19 +34,49 @@ def __init__(self, spark: SparkSession) -> None: def _analysis_job_builder(self, config_path: str) -> str: """ - WIP - For now, only works with single column methods. Build the Analyzer job code as a string expression to be evaluated. Parameters ---------- config_path: str - Path to a json config file. - Config file should have column names as keys and lists of - analysis methods as values. - - Example: - {"PassengerId": ["Completeness"], - "Age": ["Mean", "StandardDeviation", "Minimum", "Maximum"]} + Path to a yaml config file. + Config file must have 2 major keys: columns and metrics. + + Columns major key must have dataframe column names as keys and lists of + analysis methods as values (as each method listed here works with only one column as input). + + Methods major key was built to deal with methods that take more than one column or parameter. + Methods major key must have methods as keys and lists of lists as values. + + YAML Example + ------------ + + columns: + PassengerId: [Completeness] + Age: [Completeness, Mean, StandardDeviation, Minimum, Maximum, Sum, Entropy] + Sex: [Completeness, ApproxCountDistinct, Distinctness] + Fare: [Completeness, Mean, StandardDeviation] + Pclass: [DataType] + Survived: [Histogram] + Name: [MaxLength, MinLength] + metrics: + Correlation: + - [Fare, Age] + - [Fare, Survived] + Compliance: + - [Age, "Age>40.2"] + PatternMatch: + - [Name, "M(r|rs|iss)."] + ApproxQuantiles: + - [Age, '0.5', '0.25', '0.75'] + - [Fare, '0.5', '0.25', '0.75'] + Uniqueness: + - [PassengerId] + - [Name,Sex] + - [Ticket] + UniqueValueRatio: + - [PassengerId] + - [Name,Sex] Returns ------- @@ -60,10 +95,29 @@ def _analysis_job_builder(self, config_path: str) -> str: expression += ".addAnalyzer(" + method + '("' + col + '"))' for method in metricsconfig.keys(): - expression += ".addAnalyzer(" + method + '(' - for col in metricsconfig[method]: - expression += '"' + col + '", ' - expression += '))' + + for params in metricsconfig[method]: + expression += ".addAnalyzer(" + method + '(' + + if method == "ApproxQuantiles": + expression += '"' + params[0] + '", [' + for i in range(1,len(params)): + expression += params[i] + ', ' + expression += ']' + + elif method == "ApproxQuantile": + expression += '"' + params[0] + '", ' + params[1] + + elif method == "Uniqueness" or method == "UniqueValueRatio": + expression += '[' + for i in range(len(params)): + expression += '"' + params[i] + '", ' + expression += ']' + + else: + for col in params: + expression += '"' + col + '", ' + expression += '))' expression += ".run()" return expression @@ -71,22 +125,59 @@ def _analysis_job_builder(self, config_path: str) -> str: def run(self, df: DataFrame, config: str) -> DataFrame: """ - Run the DataQuality job + Run the Analyzer job Parameters ---------- df: DataFrame - A Spark DataFrame to run DataQuality jobs. + A Spark DataFrame config: str - Path to a json config file or a str expression of AnalysisRunner - to evaluate + Path to a yaml config file or a str expression of AnalysisRunner to evaluate. + + If config is a path to a yaml file, config file must have 2 major keys: columns and metrics. + + Columns major key must have dataframe column names as keys and lists of + analysis methods as values (as each method listed here works with only one column as input). + + Methods major key was built to deal with methods that take more than one column or parameter. + Methods major key must have methods as keys and lists of lists as values. + + YAML Example + ------------ + + columns: + PassengerId: [Completeness] + Age: [Completeness, Mean, StandardDeviation, Minimum, Maximum, Sum, Entropy] + Sex: [Completeness, ApproxCountDistinct, Distinctness] + Fare: [Completeness, Mean, StandardDeviation] + Pclass: [DataType] + Survived: [Histogram] + Name: [MaxLength, MinLength] + metrics: + Correlation: + - [Fare, Age] + - [Fare, Survived] + Compliance: + - [Age, "Age>40.2"] + PatternMatch: + - [Name, "M(r|rs|iss)."] + ApproxQuantiles: + - [Age, '0.5', '0.25', '0.75'] + - [Fare, '0.5', '0.25', '0.75'] + Uniqueness: + - [PassengerId] + - [Name,Sex] + - [Ticket] + UniqueValueRatio: + - [PassengerId] + - [Name,Sex] Returns ------- - DataFrame -> A DataFrame with the results for DataQuality job. + DataFrame -> A DataFrame with the results for Analyzer job. """ try: expression = self._analysis_job_builder(config) @@ -104,5 +195,12 @@ def run(self, df: DataFrame, config: str) -> DataFrame: AnalyzerContext .successMetricsAsDataFrame(self.spark, analysisResult) ) + + analysisResult_df = ( + analysisResult_df + .orderBy("entity", "instance", "name") + .withColumn("dt_update", f.lit(datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))) + ) + return analysisResult_df diff --git a/rony/data_quality/data_quality.py b/rony/data_quality/data_quality.py index 94d69ca..5a11c28 100644 --- a/rony/data_quality/data_quality.py +++ b/rony/data_quality/data_quality.py @@ -11,7 +11,7 @@ class DQ(ABC): spark: SparkSession A SparkSession object to run DataQuality jobs. SparkSession must have two configurations: - .config("spark.jars.packages", "com.amazon.deequ:deequ:2.0.0-spark-3.1") + .config("spark.jars.packages", "com.amazon.deequ:deequ:2.0.1-spark-3.2") .config("spark.jars.excludes", "net.sourceforge.f2j:arpack_combined_all") """ @@ -71,7 +71,7 @@ class DataQuality(DQ): spark: SparkSession A SparkSession object to run DataQuality jobs. SparkSession must have two configurations: - .config("spark.jars.packages", "com.amazon.deequ:deequ:2.0.0-spark-3.1") + .config("spark.jars.packages", "com.amazon.deequ:deequ:2.0.1-spark-3.2") .config("spark.jars.excludes", "net.sourceforge.f2j:arpack_combined_all") """ @@ -80,14 +80,20 @@ def __init__(self, spark: SparkSession) -> None: @classmethod - def create_pydeequ_SparkSession(cls) -> SparkSession: + def create_pydeequ_SparkSession(cls, deequ_maven_package="com.amazon.deequ:deequ:2.0.1-spark-3.2") -> SparkSession: """ - Creates a default SparkSession with PyDeequ jars. + Creates a default SparkSession with PyDeequ jars. + + Parameters + ---------- + + deequ_maven_package: str + Maven package to use in Spark application. Defaults to "com.amazon.deequ:deequ:2.0.1-spark-3.2". """ return ( SparkSession .builder - .config("spark.jars.packages", "com.amazon.deequ:deequ:2.0.0-spark-3.1") + .config("spark.jars.packages", deequ_maven_package) .config("spark.jars.excludes", "net.sourceforge.f2j:arpack_combined_all") .getOrCreate() ) @@ -95,15 +101,27 @@ def create_pydeequ_SparkSession(cls) -> SparkSession: @classmethod - def create_complete_SparkSession(cls) -> SparkSession: + def create_deequ_delta_SparkSession(cls, + deequ_maven_package="com.amazon.deequ:deequ:2.0.1-spark-3.2", + delta_maven_package="io.delta:delta-core_2.12:1.2.1") -> SparkSession: """ Creates a SparkSession with PyDeequ and Delta jars and necessary configurations. + + + Parameters + ---------- + + deequ_maven_package: str + Deequ maven package to use in Spark application. Defaults to "com.amazon.deequ:deequ:2.0.1-spark-3.2". + + delta_maven_package: str + Delta maven package to use in Spark application. Defaults to "io.delta:delta-core_2.12:1.2.1" """ return ( SparkSession .builder - .config("spark.jars.packages", "com.amazon.deequ:deequ:2.0.0-spark-3.1,io.delta:delta-core_2.12:1.0.0") + .config("spark.jars.packages", f"{deequ_maven_package},{delta_maven_package}") .config("spark.jars.excludes", "net.sourceforge.f2j:arpack_combined_all") .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") @@ -112,7 +130,7 @@ def create_complete_SparkSession(cls) -> SparkSession: def write_output(self, df: DataFrame, path: str, - mode: str = "overwrite", delta: bool = True) -> None: + mode: str = "append", delta: bool = True) -> None: """ Write output for DataQuality process. @@ -125,7 +143,7 @@ def write_output(self, df: DataFrame, path: str, path mode: str Write mode for parquet or delta table. One of "overwrite", - "append", "error" or "ignore". Defaults to "overwrite". + "append", "error" or "ignore". Defaults to "append". delta: bool If True, write a delta table on specified path. If False, write a simple parquet file. Defaults to True. From 1ea828632f070dc4e1e75dded1c9663379853bf2 Mon Sep 17 00:00:00 2001 From: Neylson Crepalde Date: Wed, 6 Jul 2022 23:26:37 -0300 Subject: [PATCH 25/25] doc/rony analyzer example --- .../examples/rony_analyzer_example.ipynb | 488 ++++++++++++++++++ 1 file changed, 488 insertions(+) create mode 100644 rony/data_quality/examples/rony_analyzer_example.ipynb diff --git a/rony/data_quality/examples/rony_analyzer_example.ipynb b/rony/data_quality/examples/rony_analyzer_example.ipynb new file mode 100644 index 0000000..6a2ce16 --- /dev/null +++ b/rony/data_quality/examples/rony_analyzer_example.ipynb @@ -0,0 +1,488 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2e536555", + "metadata": {}, + "source": [ + "# Rony Data Quality - Analyzer example" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b28f9afa", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Please set env variable SPARK_VERSION\n" + ] + } + ], + "source": [ + "import pydeequ\n", + "\n", + "from pyspark import SparkFiles\n", + "from pyspark.sql import SparkSession\n", + "\n", + "from rony.data_quality import Analyzer, DataQuality" + ] + }, + { + "cell_type": "markdown", + "id": "74a7baab", + "metadata": {}, + "source": [ + "### Create a SparkSession with PyDeequ and Delta jars from maven" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "eb1b2484", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "spark = DataQuality.create_deequ_delta_SparkSession()" + ] + }, + { + "cell_type": "markdown", + "id": "cca9fff8", + "metadata": {}, + "source": [ + "### Download *titanic* data from the web" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d0a899d7", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "url = \"https://raw.githubusercontent.com/neylsoncrepalde/titanic_data_with_semicolon/main/titanic.csv\"\n", + "spark.sparkContext.addFile(url)\n", + "df = (\n", + " spark\n", + " .read\n", + " .csv(\"file://\" + SparkFiles.get(\"titanic.csv\"), header=True, inferSchema=True, sep=\";\")\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3d467c7a", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------+--------+------+--------------------+------+----+-----+-----+----------------+-------+-----+--------+\n", + "|PassengerId|Survived|Pclass| Name| Sex| Age|SibSp|Parch| Ticket| Fare|Cabin|Embarked|\n", + "+-----------+--------+------+--------------------+------+----+-----+-----+----------------+-------+-----+--------+\n", + "| 1| 0| 3|Braund, Mr. Owen ...| male|22.0| 1| 0| A/5 21171| 7.25| null| S|\n", + "| 2| 1| 1|Cumings, Mrs. Joh...|female|38.0| 1| 0| PC 17599|71.2833| C85| C|\n", + "| 3| 1| 3|Heikkinen, Miss. ...|female|26.0| 0| 0|STON/O2. 3101282| 7.925| null| S|\n", + "| 4| 1| 1|Futrelle, Mrs. Ja...|female|35.0| 1| 0| 113803| 53.1| C123| S|\n", + "| 5| 0| 3|Allen, Mr. Willia...| male|35.0| 0| 0| 373450| 8.05| null| S|\n", + "| 6| 0| 3| Moran, Mr. James| male|null| 0| 0| 330877| 8.4583| null| Q|\n", + "| 7| 0| 1|McCarthy, Mr. Tim...| male|54.0| 0| 0| 17463|51.8625| E46| S|\n", + "| 8| 0| 3|Palsson, Master. ...| male| 2.0| 3| 1| 349909| 21.075| null| S|\n", + "| 9| 1| 3|Johnson, Mrs. Osc...|female|27.0| 0| 2| 347742|11.1333| null| S|\n", + "| 10| 1| 2|Nasser, Mrs. Nich...|female|14.0| 1| 0| 237736|30.0708| null| C|\n", + "| 11| 1| 3|Sandstrom, Miss. ...|female| 4.0| 1| 1| PP 9549| 16.7| G6| S|\n", + "| 12| 1| 1|Bonnell, Miss. El...|female|58.0| 0| 0| 113783| 26.55| C103| S|\n", + "| 13| 0| 3|Saundercock, Mr. ...| male|20.0| 0| 0| A/5. 2151| 8.05| null| S|\n", + "| 14| 0| 3|Andersson, Mr. An...| male|39.0| 1| 5| 347082| 31.275| null| S|\n", + "| 15| 0| 3|Vestrom, Miss. Hu...|female|14.0| 0| 0| 350406| 7.8542| null| S|\n", + "| 16| 1| 2|Hewlett, Mrs. (Ma...|female|55.0| 0| 0| 248706| 16.0| null| S|\n", + "| 17| 0| 3|Rice, Master. Eugene| male| 2.0| 4| 1| 382652| 29.125| null| Q|\n", + "| 18| 1| 2|Williams, Mr. Cha...| male|null| 0| 0| 244373| 13.0| null| S|\n", + "| 19| 0| 3|Vander Planke, Mr...|female|31.0| 1| 0| 345763| 18.0| null| S|\n", + "| 20| 1| 3|Masselmani, Mrs. ...|female|null| 0| 0| 2649| 7.225| null| C|\n", + "+-----------+--------+------+--------------------+------+----+-----+-----+----------------+-------+-----+--------+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "df.show()" + ] + }, + { + "cell_type": "markdown", + "id": "4e2abcb6", + "metadata": {}, + "source": [ + "### Write job configurations yaml file" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "2d8b2d50-847e-4dde-b5d6-bb8730848a48", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Writing analyzer_configs.yaml\n" + ] + } + ], + "source": [ + "%%writefile analyzer_configs.yaml\n", + "columns:\n", + " PassengerId: [Completeness]\n", + " Age: [Completeness, Mean, StandardDeviation, Minimum, Maximum, Sum, Entropy]\n", + " Sex: [Completeness, ApproxCountDistinct, Distinctness]\n", + " Fare: [Completeness, Mean, StandardDeviation]\n", + " Pclass: [DataType]\n", + " Survived: [Histogram]\n", + " Name: [MaxLength, MinLength]\n", + "metrics:\n", + " Correlation: \n", + " - [Fare, Age]\n", + " - [Fare, Survived]\n", + " Compliance: \n", + " - [Age, \"Age>40.2\"]\n", + " PatternMatch: \n", + " - [Name, \"M(r|rs|iss).\"]\n", + " ApproxQuantiles: \n", + " - [Age, '0.5', '0.25', '0.75']\n", + " - [Fare, '0.5', '0.25', '0.75']\n", + " Uniqueness:\n", + " - [PassengerId]\n", + " - [Name,Sex]\n", + " - [Ticket]\n", + " UniqueValueRatio:\n", + " - [PassengerId]\n", + " - [Name,Sex]" + ] + }, + { + "cell_type": "markdown", + "id": "af76cd09", + "metadata": {}, + "source": [ + "If you have experience with PyDeequ library, you can pass an *AnalysisRunner* statement as a string. For now, it must be a \"one liner\" expression:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "aa28b1ee", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "string_expression = 'AnalysisRunner(spark).onData(df).addAnalyzer(Size()).addAnalyzer(Completeness(\"Age\")).addAnalyzer(Mean(\"Age\")).addAnalyzer(StandardDeviation(\"Age\")).addAnalyzer(Minimum(\"Age\")).addAnalyzer(Maximum(\"Age\")).addAnalyzer(Completeness(\"Sex\")).addAnalyzer(ApproxCountDistinct(\"Sex\")).addAnalyzer(ApproxQuantile(\"Age\", 0.5)).addAnalyzer(UniqueValueRatio([\"PassengerId\", \"Sex\"])).run()'" + ] + }, + { + "cell_type": "markdown", + "id": "2db25e3d", + "metadata": {}, + "source": [ + "### Instantiate Analyzer Class" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e5d4f770", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "analyzer = Analyzer(spark)" + ] + }, + { + "cell_type": "markdown", + "id": "5f096737", + "metadata": {}, + "source": [ + "### Run the analyzer job and show results" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2e7287d9", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "res_from_file = analyzer.run(df, \"analyzer_configs.yaml\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "996b2891", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------+-------------+--------------------------+--------------------+-------------------+\n", + "|entity |instance |name |value |dt_update |\n", + "+-----------+-------------+--------------------------+--------------------+-------------------+\n", + "|Column |Age |ApproxQuantiles-0.25 |20.0 |2022-07-06-23-24-56|\n", + "|Column |Age |ApproxQuantiles-0.5 |28.0 |2022-07-06-23-24-56|\n", + "|Column |Age |ApproxQuantiles-0.75 |38.0 |2022-07-06-23-24-56|\n", + "|Column |Age |Completeness |0.8013468013468014 |2022-07-06-23-24-56|\n", + "|Column |Age |Compliance |0.16835016835016836 |2022-07-06-23-24-56|\n", + "|Column |Age |Entropy |4.045611490075093 |2022-07-06-23-24-56|\n", + "|Column |Age |Maximum |80.0 |2022-07-06-23-24-56|\n", + "|Column |Age |Mean |29.69911764705882 |2022-07-06-23-24-56|\n", + "|Column |Age |Minimum |0.42 |2022-07-06-23-24-56|\n", + "|Column |Age |StandardDeviation |14.51632115081731 |2022-07-06-23-24-56|\n", + "|Column |Age |Sum |21205.17 |2022-07-06-23-24-56|\n", + "|Column |Fare |ApproxQuantiles-0.25 |7.8958 |2022-07-06-23-24-56|\n", + "|Column |Fare |ApproxQuantiles-0.5 |14.4542 |2022-07-06-23-24-56|\n", + "|Column |Fare |ApproxQuantiles-0.75 |30.5 |2022-07-06-23-24-56|\n", + "|Column |Fare |Completeness |1.0 |2022-07-06-23-24-56|\n", + "|Column |Fare |Mean |32.2042079685746 |2022-07-06-23-24-56|\n", + "|Column |Fare |StandardDeviation |49.6655344447741 |2022-07-06-23-24-56|\n", + "|Column |Name |MaxLength |82.0 |2022-07-06-23-24-56|\n", + "|Column |Name |MinLength |12.0 |2022-07-06-23-24-56|\n", + "|Column |Name |PatternMatch |0.0 |2022-07-06-23-24-56|\n", + "|Column |PassengerId |Completeness |1.0 |2022-07-06-23-24-56|\n", + "|Column |PassengerId |UniqueValueRatio |1.0 |2022-07-06-23-24-56|\n", + "|Column |PassengerId |Uniqueness |1.0 |2022-07-06-23-24-56|\n", + "|Column |Pclass |Histogram.abs.Boolean |0.0 |2022-07-06-23-24-56|\n", + "|Column |Pclass |Histogram.abs.Fractional |0.0 |2022-07-06-23-24-56|\n", + "|Column |Pclass |Histogram.abs.Integral |891.0 |2022-07-06-23-24-56|\n", + "|Column |Pclass |Histogram.abs.String |0.0 |2022-07-06-23-24-56|\n", + "|Column |Pclass |Histogram.abs.Unknown |0.0 |2022-07-06-23-24-56|\n", + "|Column |Pclass |Histogram.bins |5.0 |2022-07-06-23-24-56|\n", + "|Column |Pclass |Histogram.ratio.Boolean |0.0 |2022-07-06-23-24-56|\n", + "|Column |Pclass |Histogram.ratio.Fractional|0.0 |2022-07-06-23-24-56|\n", + "|Column |Pclass |Histogram.ratio.Integral |1.0 |2022-07-06-23-24-56|\n", + "|Column |Pclass |Histogram.ratio.String |0.0 |2022-07-06-23-24-56|\n", + "|Column |Pclass |Histogram.ratio.Unknown |0.0 |2022-07-06-23-24-56|\n", + "|Column |Sex |ApproxCountDistinct |2.0 |2022-07-06-23-24-56|\n", + "|Column |Sex |Completeness |1.0 |2022-07-06-23-24-56|\n", + "|Column |Sex |Distinctness |0.002244668911335578|2022-07-06-23-24-56|\n", + "|Column |Survived |Histogram.abs.0 |549.0 |2022-07-06-23-24-56|\n", + "|Column |Survived |Histogram.abs.1 |342.0 |2022-07-06-23-24-56|\n", + "|Column |Survived |Histogram.bins |2.0 |2022-07-06-23-24-56|\n", + "|Column |Survived |Histogram.ratio.0 |0.6161616161616161 |2022-07-06-23-24-56|\n", + "|Column |Survived |Histogram.ratio.1 |0.3838383838383838 |2022-07-06-23-24-56|\n", + "|Column |Ticket |Uniqueness |0.6139169472502806 |2022-07-06-23-24-56|\n", + "|Dataset |* |Size |891.0 |2022-07-06-23-24-56|\n", + "|Mutlicolumn|Fare,Age |Correlation |0.09606669176903912 |2022-07-06-23-24-56|\n", + "|Mutlicolumn|Fare,Survived|Correlation |0.2573065223849626 |2022-07-06-23-24-56|\n", + "|Mutlicolumn|Name,Sex |UniqueValueRatio |1.0 |2022-07-06-23-24-56|\n", + "|Mutlicolumn|Name,Sex |Uniqueness |1.0 |2022-07-06-23-24-56|\n", + "+-----------+-------------+--------------------------+--------------------+-------------------+\n", + "\n" + ] + } + ], + "source": [ + "res_from_file.show(truncate=False, n=50)" + ] + }, + { + "cell_type": "markdown", + "id": "501cea3f", + "metadata": {}, + "source": [ + "### Run analyzer job from string expression" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "bb7fa942", + "metadata": {}, + "outputs": [], + "source": [ + "res_from_expression = analyzer.run(df, string_expression)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "1a7ee91f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------+---------------+-------------------+------------------+-------------------+\n", + "|entity |instance |name |value |dt_update |\n", + "+-----------+---------------+-------------------+------------------+-------------------+\n", + "|Column |Age |ApproxQuantile-0.5 |28.0 |2022-07-06-23-24-59|\n", + "|Column |Age |Completeness |0.8013468013468014|2022-07-06-23-24-59|\n", + "|Column |Age |Maximum |80.0 |2022-07-06-23-24-59|\n", + "|Column |Age |Mean |29.69911764705882 |2022-07-06-23-24-59|\n", + "|Column |Age |Minimum |0.42 |2022-07-06-23-24-59|\n", + "|Column |Age |StandardDeviation |14.51632115081731 |2022-07-06-23-24-59|\n", + "|Column |Sex |ApproxCountDistinct|2.0 |2022-07-06-23-24-59|\n", + "|Column |Sex |Completeness |1.0 |2022-07-06-23-24-59|\n", + "|Dataset |* |Size |891.0 |2022-07-06-23-24-59|\n", + "|Mutlicolumn|PassengerId,Sex|UniqueValueRatio |1.0 |2022-07-06-23-24-59|\n", + "+-----------+---------------+-------------------+------------------+-------------------+\n", + "\n" + ] + } + ], + "source": [ + "res_from_expression.show(truncate=False)" + ] + }, + { + "cell_type": "markdown", + "id": "4e63a03f", + "metadata": {}, + "source": [ + "### Write dataframe output as a Delta Table" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ad2080c0", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "analyzer.write_output(res_from_file, \"./dataqualityoutput\", delta=True, mode=\"append\")" + ] + }, + { + "cell_type": "markdown", + "id": "c05cc09e", + "metadata": {}, + "source": [ + "Check if the results were correctly written." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "58673876", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-----------+-------------+--------------------+--------------------+-------------------+\n", + "| entity| instance| name| value| dt_update|\n", + "+-----------+-------------+--------------------+--------------------+-------------------+\n", + "| Column| Age|ApproxQuantiles-0.25| 20.0|2022-07-06-23-24-56|\n", + "| Column| Age| ApproxQuantiles-0.5| 28.0|2022-07-06-23-24-56|\n", + "| Column| Age|ApproxQuantiles-0.75| 38.0|2022-07-06-23-24-56|\n", + "| Column| Age| Completeness| 0.8013468013468014|2022-07-06-23-24-56|\n", + "| Column| Age| Compliance| 0.16835016835016836|2022-07-06-23-24-56|\n", + "| Column| Age| Entropy| 4.045611490075093|2022-07-06-23-24-56|\n", + "| Column| Age| Maximum| 80.0|2022-07-06-23-24-56|\n", + "| Column| Age| Mean| 29.69911764705882|2022-07-06-23-24-56|\n", + "| Column| Age| Minimum| 0.42|2022-07-06-23-24-56|\n", + "| Column| Age| StandardDeviation| 14.51632115081731|2022-07-06-23-24-56|\n", + "| Column| Age| Sum| 21205.17|2022-07-06-23-24-56|\n", + "| Column| Fare|ApproxQuantiles-0.25| 7.8958|2022-07-06-23-24-56|\n", + "| Column| Fare| ApproxQuantiles-0.5| 14.4542|2022-07-06-23-24-56|\n", + "| Column| Fare|ApproxQuantiles-0.75| 30.5|2022-07-06-23-24-56|\n", + "| Column| Fare| Completeness| 1.0|2022-07-06-23-24-56|\n", + "| Column| Fare| Mean| 32.2042079685746|2022-07-06-23-24-56|\n", + "| Column| Fare| StandardDeviation| 49.6655344447741|2022-07-06-23-24-56|\n", + "| Column| Name| MaxLength| 82.0|2022-07-06-23-24-56|\n", + "| Column| Name| MinLength| 12.0|2022-07-06-23-24-56|\n", + "| Column| Name| PatternMatch| 0.0|2022-07-06-23-24-56|\n", + "| Column| PassengerId| Completeness| 1.0|2022-07-06-23-24-56|\n", + "| Column| PassengerId| UniqueValueRatio| 1.0|2022-07-06-23-24-56|\n", + "| Column| PassengerId| Uniqueness| 1.0|2022-07-06-23-24-56|\n", + "| Column| Pclass|Histogram.abs.Boo...| 0.0|2022-07-06-23-24-56|\n", + "| Column| Pclass|Histogram.abs.Fra...| 0.0|2022-07-06-23-24-56|\n", + "| Column| Pclass|Histogram.abs.Int...| 891.0|2022-07-06-23-24-56|\n", + "| Column| Pclass|Histogram.abs.String| 0.0|2022-07-06-23-24-56|\n", + "| Column| Pclass|Histogram.abs.Unk...| 0.0|2022-07-06-23-24-56|\n", + "| Column| Pclass| Histogram.bins| 5.0|2022-07-06-23-24-56|\n", + "| Column| Pclass|Histogram.ratio.B...| 0.0|2022-07-06-23-24-56|\n", + "| Column| Pclass|Histogram.ratio.F...| 0.0|2022-07-06-23-24-56|\n", + "| Column| Pclass|Histogram.ratio.I...| 1.0|2022-07-06-23-24-56|\n", + "| Column| Pclass|Histogram.ratio.S...| 0.0|2022-07-06-23-24-56|\n", + "| Column| Pclass|Histogram.ratio.U...| 0.0|2022-07-06-23-24-56|\n", + "| Column| Sex| ApproxCountDistinct| 2.0|2022-07-06-23-24-56|\n", + "| Column| Sex| Completeness| 1.0|2022-07-06-23-24-56|\n", + "| Column| Sex| Distinctness|0.002244668911335578|2022-07-06-23-24-56|\n", + "| Column| Survived| Histogram.abs.0| 549.0|2022-07-06-23-24-56|\n", + "| Column| Survived| Histogram.abs.1| 342.0|2022-07-06-23-24-56|\n", + "| Column| Survived| Histogram.bins| 2.0|2022-07-06-23-24-56|\n", + "| Column| Survived| Histogram.ratio.0| 0.6161616161616161|2022-07-06-23-24-56|\n", + "| Column| Survived| Histogram.ratio.1| 0.3838383838383838|2022-07-06-23-24-56|\n", + "| Column| Ticket| Uniqueness| 0.6139169472502806|2022-07-06-23-24-56|\n", + "| Dataset| *| Size| 891.0|2022-07-06-23-24-56|\n", + "|Mutlicolumn| Fare,Age| Correlation| 0.09606669176903912|2022-07-06-23-24-56|\n", + "|Mutlicolumn|Fare,Survived| Correlation| 0.2573065223849626|2022-07-06-23-24-56|\n", + "|Mutlicolumn| Name,Sex| UniqueValueRatio| 1.0|2022-07-06-23-24-56|\n", + "|Mutlicolumn| Name,Sex| Uniqueness| 1.0|2022-07-06-23-24-56|\n", + "| Column| Age|ApproxQuantiles-0.25| 20.0|2022-07-06-23-08-11|\n", + "| Column| Age| ApproxQuantiles-0.5| 28.0|2022-07-06-23-08-11|\n", + "+-----------+-------------+--------------------+--------------------+-------------------+\n", + "only showing top 50 rows\n", + "\n" + ] + } + ], + "source": [ + "spark.read.parquet(\"dataqualityoutput/\").show(50)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}