pip install zingg and resolve customers, suppliers and products from any notebook or Spark job. Describe your fields, point at your data, label a few pairs, train and match, all in Python, on Databricks, Microsoft Fabric, AWS or your own Spark.
pip install zingg, then import the client and the pipes.
One FieldDefinition per column, with a match type that says how to compare it.
Pipes read the input and write the output: Delta, Parquet, Snowflake, BigQuery, Unity Catalog, JDBC or a DataFrame you already have.
Pick the phase with ClientOptions and call initAndExecute(). The same script labels, trains and matches.
from zingg.client import *
from zingg.pipes import *
args = Arguments()
fname = FieldDefinition("fname", "string", MatchType.FUZZY)
email = FieldDefinition("email", "string", MatchType.EMAIL)
dob = FieldDefinition("dob", "string", MatchType.EXACT)
args.setFieldDefinition([fname, email, dob])
args.setModelId("customers")
args.setZinggDir("models")
customers = Pipe("customers", "delta")
customers.addProperty("location", "/lake/crm/customers")
args.setData(customers)
resolved = Pipe("resolved", "delta")
resolved.addProperty("location", "/lake/crm/resolved")
args.setOutput(resolved)
options = ClientOptions([ClientOptions.PHASE, "match"])
zingg = Zingg(args, options)
zingg.initAndExecute()pip install zinggRead and write Snowflake tables from Python, or run Zingg Enterprise natively inside your Snowflake account.
SnowflakePipe reads your Snowflake tables and writes resolved records back, through the Snowflake Spark connector. Run it from the Spark you already use, such as Databricks, Fabric or EMR.
Zingg Enterprise runs inside your Snowflake account on Snowpark Container Services. You start each phase from SQL as a Snowflake job, with no servers outside Snowflake, so records never leave it.
import os
from zingg.pipes import *
customers = SnowflakePipe("customers")
customers.setURL("myorg-myaccount.snowflakecomputing.com")
customers.setUser(os.environ["SF_USER"])
customers.setPassword(os.environ["SF_PASSWORD"])
customers.setDatabase("CRM")
customers.setSFSchema("PUBLIC")
customers.setWarehouse("COMPUTE_WH")
customers.setDbTable("CUSTOMERS")
args.setData(customers)Fuzzy names and addresses, exact identifiers, emails, postcodes, numbers with units, long text. Mark a column DONT_USE to carry it through to the output without matching on it.
Delta and Parquet through Pipe, SnowflakePipe, BigQueryPipe, UCPipe for Unity Catalog tables, and JDBC or any Spark source. Or pass a DataFrame from your own code.
findTrainingData, label, train, match and link, plus findAndLabel and trainMatch to do two steps in one run.
ZinggWithSpark reuses the session your notebook already has, on Databricks, Microsoft Fabric, AWS EMR or Glue.
It is a Python program, so it runs wherever your jobs run: Airflow, Databricks Workflows, Fabric pipelines, keeping the configuration in Git.
The Zingg Enterprise Python API adds deterministic matching, incremental runs, mapping match types for nicknames, explanations of every match and output statistics.
Each FieldDefinition takes a MatchType. Zingg learns how much each field matters from the pairs you label.
| MatchType | What it compares |
|---|---|
| FUZZY | Typo-tolerant matching for names, addresses and free text |
| EXACT | A strong signal when two values are identical |
| Compares the part of an email before the @ | |
| PINCODE | Postal and ZIP codes across common formats |
| NUMERIC | Numbers inside strings, ignoring the letters around them |
| NUMERIC_WITH_UNITS | Numbers with their units, such as 500 ml or 16 GB |
| TEXT | Overlapping words in longer descriptions |
| ONLY_ALPHABETS_EXACT / FUZZY | Letters only, numbers stripped, compared exactly or fuzzily |
| NULL_OR_BLANK | Lets the model learn what a missing value means |
| DONT_USE | Kept in the output, not used for matching |
| Zingg Community | Zingg Enterprise | |
|---|---|---|
| Package | pip install zingg | pip install zinggEC |
| Arguments | Arguments, FieldDefinition | EArguments, EFieldDefinition |
| Matching | AI matching trained on your labels | AI matching plus deterministic rules in the same run |
| Updates | Rerun match on the full data | runIncremental for new, changed and deleted records |
| Nicknames and abbreviations | Not included | MAPPING match types from a lookup file |
| Sources | Delta, Parquet, Snowflake, BigQuery, Unity Catalog, JDBC, DataFrames | Adds in-memory pipes |
| Explanations | Not included | Why records matched: the pairs, their scores and how each cluster formed |
| Output | Clusters with a Zingg ID per run | Persistent ZINGG_ID, pass-through records and run statistics |
Run pip install zingg for Zingg Community. Zingg Enterprise uses pip install zinggEC and needs an Enterprise licence. The Python API runs on Spark.
On any Spark you have: Databricks, Microsoft Fabric, AWS EMR, AWS Glue or a local Spark. In a notebook, ZinggWithSpark uses the notebook's Spark session. As a script, run it with zingg.sh --run.
No. The Python API sets the same fields, data and model options in code, so the configuration lives with the rest of your pipeline.
Yes. Run findTrainingData and label, or findAndLabel to do both, then train. In notebooks you can label pairs in the notebook itself.
Yes. SnowflakePipe reads Snowflake tables as input and writes the resolved output back, through the Snowflake Spark connector. Zingg Enterprise can also run natively inside Snowflake on Snowpark Container Services, started from SQL.
Yes. Pass the DataFrame as the input instead of a file or table pipe, and Zingg matches it on the same Spark session.
Install the open source package today, or talk to us about Zingg Enterprise.