Skip to main content

Apache Hive and MariaDB(MySQL) compare library

Project description

migcomparator

PyPI version PyPI license

Apache Hive와 MariaDB(or MySQL)에 위치한 테이블의 데이터를 Pandas를 통해 비교해주는 라이브러리입니다.

Install

pip install migcomparator

Basic usage

MariaDB Mock data

> select * from `mock_1` limit 3
+-----------------+-------------+--------+--------------+---------+-------------------+------+
|vin              |car_model    |car_make|car_model_year|color    |created_at         |num   |
+-----------------+-------------+--------+--------------+---------+-------------------+------+
|19UUA56763A081084|Rodeo        |Isuzu   |2000          |Goldenrod|2021-11-18 08:38:22|57.064|
|19UUA65545A837147|Amanti       |Kia     |2004          |Yellow   |2021-07-07 13:32:59|NULL  |
|19UUA65566A654351|B-Series Plus|Mazda   |2000          |Orange   |2021-07-25 05:39:41|NULL  |
+-----------------+-------------+--------+--------------+---------+-------------------+------+

Apache Hive Mock data

> select * from `mock_2` limit 3
+-----------------+---------+----------+--------------+---------+-------------------+------+
|vin              |car_model|car_mk    |car_model_yyyy|color    |created_at         |num   |
+-----------------+---------+----------+--------------+---------+-------------------+------+
|19UUA65684A456148|Discovery|Land Rover|1996          |Violet   |2021-04-18 11:25:59|42.526|
|19UUA66228A764918|GTO      |Mitsubishi|1994          |Yellow   |2021-10-25 23:41:01|10.004|
|19UUA66267A272004|Corvette |Chevrolet |1960          |Puce     |2021-02-26 19:25:45|NULL  |
+-----------------+---------+----------+--------------+---------+-------------------+------+

> select * from `mock_3` limit 3
+-----------------+-------------+------+--------------+------------------+-------------------+------+
|vin              |car_model    |car_mk|car_model_yyyy|color             |created_at         |numb  |
+-----------------+-------------+------+--------------+------------------+-------------------+------+
|19UUA56763A081084|Rodeo        |Isuzu |2000          |GoldenrodGoldenrod|2021-11-18 08:38:22|58.064|
|19UUA65545A837147|Amanti       |Kia   |2004          |YellowYellow      |2021-07-07 13:32:59|NULL  |
|19UUA65566A654351|B-Series Plus|Mazda |2000          |OrangeOrange      |2021-07-25 05:39:41|NULL  |
+-----------------+-------------+------+--------------+------------------+-------------------+------+

테이블간의 데이터 건수 비교

MariaDB(or MySQL) to Apache Hive

from migcomparator.models.pandas_validator import PandasValidator
from migcomparator.models.table import Table
from migcomparator.query_sender.connector import MariadbConnector, HiveConnector

# create datasource connector
mariadb_sender = \ 
        MariadbConnector(
            host='localhost',
            port=3306,
            user='username',
            password='password',
            database='schema'
        )

hive_sender = \ 
        HiveConnector(
            host='localhost',
            port=10000,
            user='username',
            password='password',
            database='schema',
            auth_mechanism='PLAIN'
        )

# create source & target logical table
source = Table(name='mock_1', sender=mariadb_sender) \
            .where("date_format(`created_at`, '%Y%m%d') = '20220101'") \
            .where("`vin` = 'fakevin'")

# Hive 테이블은 pk를 명시적으로 지정
target = Table(name='mock_2', sender=hive_sender, pk=['vin']) \
            .where("date_format(created_at, 'yyyyMMdd') = '20220101'") \
            .where("`vin` = 'fakevin'")

# count compare, PairResult 객체 반환
pair_result = PandasValidator.count_compare(
    source=source, target=target
)

PairResult 결과

(source: 1000, target: 850, match: False)

테이블간의 대칭차집합

MariaDB(or MySQL) to Apache Hive

from migcomparator.models.pandas_validator import PandasValidator
from migcomparator.models.table import Table
from migcomparator.query_sender.connector import MariadbConnector, HiveConnector

...

# create source & target logical table
source = Table(name='mock_1', sender=mariadb_sender) \
            .where("date_format(`created_at`, '%Y%m%d') = '20220101'") \
            .where("`vin` = 'fakevin'")

# Hive 테이블은 pk를 명시적으로 지정
target = Table(name='mock_2', sender=hive_sender, pk=['vin']) \
            .where("date_format(created_at, 'yyyyMMdd') = '20220101'") \
            .where("`vin` = 'fakevin'")

# intersect difference compare, PairResult 객체 반환
pair_result = PandasValidator.difference_compare(source=source, target=target)

PairResult 결과

[TIME ELAPSED] - (time: 0:00:00.063220, text: difference compare)
(source:                    
                   vin   location
0    19UUA56763A081084  left_only
1    19UUA65545A837147  left_only
..                 ...        ...
998  YV4902NC9F1050126  left_only
999  YV4952BL9E1397234  left_only

[1000 rows x 2 columns], 

target:                     
                    vin    location
1000  19UUA65684A456148  right_only
1001  19UUA66228A764918  right_only
...                 ...         ...
1848  YV4952CF4C1496548  right_only
1849  ZHWGU5BR6EL855505  right_only

[850 rows x 2 columns], 
match: False)

테이블간의 불일치 데이터 추출

MariaDB(or MySQL) to Apache Hive

from migcomparator.models.pandas_validator import PandasValidator
from migcomparator.models.table import Table, ColumnPair
from migcomparator.query_sender.connector import MariadbConnector, HiveConnector

...

# create source & target logical table
source = Table(name='mock_1', sender=mariadb_sender) \
            .where("date_format(`created_at`, '%Y%m%d') = '20220101'") \
            .where("`vin` = 'fakevin'")

# Hive 테이블은 pk를 명시적으로 지정
target = Table(name='mock_3', sender=hive_sender, pk=['vin']) \
            .where("date_format(created_at, 'yyyyMMdd') = '20220101'") \
            .where("`vin` = 'fakevin'")

# SingleResult 객체 반환
single_result = PandasValidator.value_compare(
            source=source,
            target=target,
            # on은 join대상의 컬럼을 명시적으로 지정, 이름이 같다면 생략가능
            on=[ColumnPair(source='vin', target='vin')],
            # colpair는 테이블간의 컬럼명이 다를때 매치시키기 위해 사용
            colpair=[
                ColumnPair(source='car_make', target='car_mk'),
                ColumnPair(source='car_model_year', target='car_model_yyyy'),
                ColumnPair(source='num', target='numb'),
            ])

SingleResult 결과

  • 일치하는 데이터는 None, 불일치하는 데이터는 [source value, target value] 형식으로 구성
[TIME ELAPSED] - (time: 0:00:00.085695, text: value compare)
               vin,vin                      color,color          num,numb
0    19UUA56763A081084  [Goldenrod, GoldenrodGoldenrod]  [57.064, 58.064]
1    19UUA65545A837147           [Yellow, YellowYellow]              None
2    19UUA65566A654351           [Orange, OrangeOrange]              None
3    19UUA76537A154797           [Fuscia, FusciaFuscia]    [6.472, 7.472]
4    19UUA76667A986661  [Turquoise, TurquoiseTurquoise]  [40.263, 41.263]
..                 ...                              ...               ...
995  YV440MBC6F1570276                 [Teal, TealTeal]      [35.4, 36.4]
996  YV440MBD6F1653487           [Yellow, YellowYellow]  [81.213, 82.213]
997  YV4852CZ6B1343304                 [Blue, BlueBlue]  [31.325, 32.325]
998  YV4902NC9F1050126  [Turquoise, TurquoiseTurquoise]  [34.464, 35.464]
999  YV4952BL9E1397234  [Goldenrod, GoldenrodGoldenrod]  [98.871, 99.871]

User Component

Connector

DataSource에게 질의를 수행하고 결과를 Validator에게 전달해주기위한 클래스.

  • MariadbConnector
  • HiveConnector
from migcomparator.query_sender.connector import MariadbConnector, HiveConnector

mariadb_sender = \ 
        MariadbConnector(
            host='localhost',
            port=3306,
            user='username',
            password='password',
            database='schema'
        )

hive_sender = \ 
        HiveConnector(
            host='localhost',
            port=10000,
            user='username',
            password='password',
            database='schema',
            auth_mechanism='PLAIN'
        )

Table

from migcomparator.models.table import Table

source = Table(name='mock_1', sender=mariadb_sender) \
            .where("date_format(`created_at`, '%Y%m%d') = '20220101'")

# Hive 테이블은 pk를 명시적으로 지정
target = Table(name='mock_2', sender=hive_sender, pk=['vin']) \
            .where("date_format(created_at, 'yyyyMMdd') = '20220101'")
__init__(self, name: str, sender: BaseConnectorMeta, pk: List[str]): Table
  • name
    • DataSource에 위치한 테이블명
  • sender
    • 사용할 Connector객체를 기입 (MariadbConnector or HiveConnector)
  • pk
    • Hive에 위치한 테이블의 경우 pk를 명시적으로 기입
where(self, clause: str): Table
  • clause
    • 테이블에서 데이터를 필터링하기위한 where 구문

ColumnPair

from migcomparator.models.table import ColumnPair

colpair = ColumnPair(source='car_model_year', target='car_model_yyyy')
__init__(self, source: str, target: str): Table

비교하고자 하는 테이블간의 컬렴밍이 다른경우 컬럼명을 매치시키기 위해 사용

  • source
    • source 테이블의 컬럼명
  • target
    • target 테이블의 컬럼명

Validator

  • PandasValidator
    • DataSource에 위치한 데이터를 라이브러리가 설치된 단일머신으로 들고와 비교를 수행하는 Validator (소규모 데이터셋에 적합)

데이터 건수 비교

count_compare(cls, source: Table, target: Table): PairResult

source와 target에 비교대상 Table 객체를 인자로 전달하여, 두 테이블간의 데이터 count 결과반환

대칭차집합 비교

difference_compare(cls, source: Table, target: Table, colpair: List[ColumnPair] = None): PairResult

source와 target에 비교대상 Table 객체를 인자로 전달하여, full-outer join 수행후, 각 테이블에 존재하지 않는 primary key를 반환

  • colpair
    • 비교하고자 하는 테이블간의 컬렴밍이 다른경우 컬럼명을 매치시키기 위해 사용

테이블간의 불일치 데이터 추출

value_compare(cls, source: Table, target: Table, on: List[ColumnPair] = None, colpair: List[ColumnPair] = None): SingleResult

source와 target에 비교대상 Table 객체를 인자로 전달하여, inner join후, 테이블의 모든 컬럼들을 비교하여 불일치하는 데이터 추출

  • on
    • inner join의 대상이되는 컬럼들을 명시적으로 지정할때 사용(pk의 컬럼명이 다른경우 사용)
  • colpair
    • 비교하고자 하는 테이블간의 컬렴밍이 다른경우 컬럼명을 매치시키기 위해 사용

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

migcomparator-1.0.3.tar.gz (16.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

migcomparator-1.0.3-py3-none-any.whl (17.5 kB view details)

Uploaded Python 3

File details

Details for the file migcomparator-1.0.3.tar.gz.

File metadata

  • Download URL: migcomparator-1.0.3.tar.gz
  • Upload date:
  • Size: 16.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1

File hashes

Hashes for migcomparator-1.0.3.tar.gz
Algorithm Hash digest
SHA256 23236b35ea93561a9c6f5e637b39ea50656368d05a118d7ef40d9698ae2ebd38
MD5 49f886ef62598676498eb7208cad7845
BLAKE2b-256 228a0b5fada907c0a8ffc46949d4d9401664ce6df453134707b0469f6be242af

See more details on using hashes here.

File details

Details for the file migcomparator-1.0.3-py3-none-any.whl.

File metadata

  • Download URL: migcomparator-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 17.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1

File hashes

Hashes for migcomparator-1.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 5b7cbf578858f20da3f459715ac8c4afd58361ec96664d572f2365d0582dc56a
MD5 dfa6cc2c6e09b3a347c093fe3304c2ad
BLAKE2b-256 94e5f4caa17b2cb294e4be9748a2d6fbe6eb7f6a1269ad2d5ef8bdad35c1d56b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page