Format: text/x-python
⬇ Download File (3.8 KB)
   1  from typing import  Dict, List
   2  import boto3
   3  from config import configManager
   4  
   5  class DataExtractor:
   6      def __init__(self, spark_session, source):
   7          self.spark_session = spark_session
   8          self.options= configManager().get_details(source)
   9          self.creds= self.options['creds']
  10          self.source = source
  11          
  12      def get_transformed(self,df):
  13          try:
  14              logic=configManager().get_config(f"{self.source.split('_')[0]}_transformation")
  15              logic = ','.join([f" {i[1]} as {i[0]}" for i in logic.items()])
  16              df.createOrReplaceTempView(f'__df__{self.source}')
  17              return  self.spark_session.sql(f"select {logic} from __df__{self.source}")
  18          except Exception as e:
  19              raise e
  20              #return logic
  21              
  22      def push_to_prod_d(df, source=None):
  23          ####
  24          """DataFrame
  25          Customer Data pushed to PROD D
  26          """
  27      
  28      def extract_data(self,columns :str =None, pushdown_predicate : str =None, limit :int=None ):
  29          # Connect to Snowflake using the AWS Snowflake Connector
  30          # Extract data from Snowflake using Glue
  31          """
  32          source eg: petco-snowflake, retailscape-aurora, glue etc
  33          columns : ','.join(list_of_columns)
  34          pushdown_predicate : source ='xyz' and cast(date as varchar) = '2023-01-08'
  35          """
  36          source = self.source
  37          columns = columns if columns else '*'
  38          pushdown_predicate= 'where '+pushdown_predicate if pushdown_predicate else ''
  39          limit = f'limit {str(limit)}' if limit else ''
  40          
  41          if 'glue' == source:
  42              
  43              query = f"SELECT {columns} FROM {self.options['database']}.{self.options['table']}  {pushdown_predicate} {limit}".strip()
  44              
  45              df= self.spark_session.sql(query)
  46              
  47          elif 'snowflake' in source:
  48              
  49              sfoptions = {
  50                            "sfURL" : self.creds['account']+'.snowflakecomputing.com',
  51                            "sfUser" : self.creds['user'],
  52                            "sfPassword" : self.creds['password'],
  53                            "sfDatabase" : self.options['database'],
  54                            "sfSchema" : self.options['schema'],
  55                            "sfWarehouse" : self.options['warehouse']
  56                          }
  57                          
  58              
  59              
  60              query = f"SELECT {columns} FROM {self.options['schema']}.{self.options['table']} {pushdown_predicate} {limit}".strip()
  61              
  62              df = self.spark_session.read.format('net.snowflake.spark.snowflake') \
  63                    .options(**sfoptions) \
  64                    .option("query",  query) \
  65                    .load()
  66          elif 'aurora' in source:
  67              
  68              table = self.options['table']
  69              database= self.options['database']
  70              try:
  71                  host=self.creds['host']
  72              except:
  73                  host=self.creds['base_url']
  74              try:
  75                  port=self.creds['port']
  76              except:
  77                  port='5432'
  78              try:
  79                  user=self.creds['user']
  80              except:
  81                  user='postgres'
  82              try:    
  83                  password = self.creds['password']
  84              except:
  85                  raise ValueError(f"Password Not Defined in secret")
  86                  
  87              url= f'jdbc:postgresql://{host}:{port}/{database}'
  88         
  89              query = f"SELECT {columns} FROM {self.options['table']} {pushdown_predicate} {limit}".strip()
  90              
  91              
  92              df = self.spark_session.read.format("jdbc").option("url", url)\
  93                  .option("user", user).option("password", password)\
  94                      .option("query", query).load()
  95                  
  96              #df = self.spark_session.read.jdbc(url=AURORA_DATABASE_URL, table=query, properties=properties)
  97              
  98          return df