Get hands-on experience with 20+ free Google Cloud products and $300 in free credit for new customers.

Json with Select Distinct

Is it possible to utilize 'Select Distinct' with a table containing a JSON column, especially when dealing with large datasets?

Solved Solved
0 3 1,727
2 ACCEPTED SOLUTIONS

Hey is it possible if we can use group by instead of distinct ?

 

View solution in original post

Yes, you can use GROUP BY instead of SELECT DISTINCT when working with JSON columns in Google Cloud BigQuery. This approach can often provide more flexibility and performance benefits, especially when dealing with large datasets.

View solution in original post

3 REPLIES 3

BigQuery does not directly support using SELECT DISTINCT on a JSON column. However, there are workarounds you can employ, particularly when dealing with large datasets:

Understanding the Issue

JSON data is semi-structured, meaning it can have variations in its structure within the same column. SELECT DISTINCT can be challenging because it compares JSON values as strings, which might differ due to variations in formatting or ordering, even if they represent the same underlying information.

Workarounds

1. Conversion to String (Less Precise):

The simplest approach is to convert the JSON column to a string using the TO_JSON_STRING function.

SELECT DISTINCT TO_JSON_STRING(your_json_column)
FROM your_table;

Caveat: This method might not be perfectly accurate if your JSON data has variations in key ordering or whitespace, as these variations will be reflected in the string representation.

2. Normalization (More Precise, but Complex):

Normalize the JSON data into separate columns. This involves extracting relevant keys and values into their own columns with appropriate data types.

SELECT DISTINCT key1, key2, ...
FROM your_table, 
     JSON_EXTRACT_SCALAR(your_json_column, '$.key1') AS key1,
     JSON_EXTRACT_SCALAR(your_json_column, '$.key2') AS key2;

Caveat: This method requires you to know the structure of your JSON data and might involve more complex queries. It works best when the JSON structure is consistent across rows.

3. Custom Functions (Flexible):

Write user-defined functions (UDFs) in SQL or JavaScript to extract and compare relevant information from your JSON data. Use these functions in your SELECT DISTINCT queries.

Considerations for Large Datasets:

  • Performance: Normalization and custom functions can be computationally expensive on large datasets. Consider creating materialized views or pre-processing the data if you need to perform these operations frequently.

  • Partitioning/Clustering: If your table is partitioned or clustered, BigQuery can leverage this to optimize queries, potentially improving performance when dealing with large datasets.

Assume you have a table events with a JSON column event_data containing:

{"id": 1, "type": "click"}
{"type": "click", "id": 1}  
{"id": 2, "type": "view"}

To get distinct events based on id and type, you can use:

SELECT DISTINCT 
    JSON_EXTRACT_SCALAR(event_data, '$.id') AS id, 
    JSON_EXTRACT_SCALAR(event_data, '$.type') AS type 
FROM `project.dataset.events`;

This will return:

{"id": "1", "type": "click"}
{"id": "2", "type": "view"}

 

Hey is it possible if we can use group by instead of distinct ?

 

Yes, you can use GROUP BY instead of SELECT DISTINCT when working with JSON columns in Google Cloud BigQuery. This approach can often provide more flexibility and performance benefits, especially when dealing with large datasets.