Skip to content

Commit

Permalink
fix: Resolving syntax error while querying a feature view with column…
Browse files Browse the repository at this point in the history
… name starting with a number and BigQuery as data source (#4908)

* Fixing issue #4688

Signed-off-by: Dharmisha Doshi <dharmishadoshi@gmail.com>

* Fixing issue #4688

Signed-off-by: Dharmisha Doshi <dharmishadoshi@gmail.com>

* Fixing issue #4688

Signed-off-by: Dharmisha Doshi <dharmishadoshi@gmail.com>

* resolving PEP 8 warnings

Signed-off-by: Dharmisha Doshi <dharmishadoshi@gmail.com>

* resolving linting issues

Signed-off-by: Dharmisha Doshi <dharmishadoshi@gmail.com>

---------

Signed-off-by: Dharmisha Doshi <dharmishadoshi@gmail.com>
Co-authored-by: n0g0791 <nishant.gaurav0@walmart.com>
Co-authored-by: nishantgaurav-dev <nishantgaurav26@gmail.com>
Co-authored-by: dharmishadoshi@gmail.com <d0d0fmz@m-j2t66th1w2.homeoffice.wal-mart.com>
  • Loading branch information
4 people authored Jan 19, 2025
1 parent fc8cff0 commit d3495a0
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 4 deletions.
9 changes: 6 additions & 3 deletions sdk/python/feast/infra/offline_stores/bigquery.py
Original file line number Diff line number Diff line change
Expand Up @@ -901,7 +901,10 @@ def arrow_schema_to_bq_schema(arrow_schema: pyarrow.Schema) -> List[SchemaField]
{{ featureview.created_timestamp_column ~ ' as created_timestamp,' if featureview.created_timestamp_column else '' }}
{{ featureview.entity_selections | join(', ')}}{% if featureview.entity_selections %},{% else %}{% endif %}
{% for feature in featureview.features %}
{{ feature }} as {% if full_feature_names %}{{ featureview.name }}__{{featureview.field_mapping.get(feature, feature)}}{% else %}{{ featureview.field_mapping.get(feature, feature) }}{% endif %}{% if loop.last %}{% else %}, {% endif %}
{{ feature | backticks }} as {% if full_feature_names %}
{{ featureview.name }}__{{featureview.field_mapping.get(feature, feature)}}{% else %}
{{ featureview.field_mapping.get(feature, feature) | backticks }}{% endif %}
{% if loop.last %}{% else %}, {% endif %}
{% endfor %}
FROM {{ featureview.table_subquery }}
WHERE {{ featureview.timestamp_field }} <= '{{ featureview.max_event_timestamp }}'
Expand Down Expand Up @@ -995,14 +998,14 @@ def arrow_schema_to_bq_schema(arrow_schema: pyarrow.Schema) -> List[SchemaField]
The entity_dataframe dataset being our source of truth here.
*/
SELECT {{ final_output_feature_names | join(', ')}}
SELECT {{ final_output_feature_names | backticks | join(', ')}}
FROM entity_dataframe
{% for featureview in featureviews %}
LEFT JOIN (
SELECT
{{featureview.name}}__entity_row_unique_id
{% for feature in featureview.features %}
,{% if full_feature_names %}{{ featureview.name }}__{{featureview.field_mapping.get(feature, feature)}}{% else %}{{ featureview.field_mapping.get(feature, feature) }}{% endif %}
,{% if full_feature_names %}{{ featureview.name }}__{{featureview.field_mapping.get(feature, feature)}}{% else %}{{ featureview.field_mapping.get(feature, feature) | backticks }}{% endif %}
{% endfor %}
FROM {{ featureview.name }}__cleaned
) USING ({{featureview.name}}__entity_row_unique_id)
Expand Down
12 changes: 11 additions & 1 deletion sdk/python/feast/infra/offline_stores/offline_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,9 @@ def build_point_in_time_query(
full_feature_names: bool = False,
) -> str:
"""Build point-in-time query between each feature view table and the entity dataframe for Bigquery and Redshift"""
template = Environment(loader=BaseLoader()).from_string(source=query_template)
env = Environment(loader=BaseLoader())
env.filters["backticks"] = enclose_in_backticks
template = env.from_string(source=query_template)

final_output_feature_names = list(entity_df_columns)
final_output_feature_names.extend(
Expand Down Expand Up @@ -252,3 +254,11 @@ def get_pyarrow_schema_from_batch_source(
column_names.append(column_name)

return pa.schema(pa_schema), column_names


def enclose_in_backticks(value):
# Check if the input is a list
if isinstance(value, list):
return [f"`{v}`" for v in value]
else:
return f"`{value}`"

0 comments on commit d3495a0

Please sign in to comment.