snowflake-ml-python 1.6.2__py3-none-any.whl → 1.6.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snowflake/cortex/__init__.py +4 -0
- snowflake/cortex/_classify_text.py +2 -2
- snowflake/cortex/_embed_text_1024.py +37 -0
- snowflake/cortex/_embed_text_768.py +37 -0
- snowflake/cortex/_extract_answer.py +2 -2
- snowflake/cortex/_sentiment.py +2 -2
- snowflake/cortex/_summarize.py +2 -2
- snowflake/cortex/_translate.py +2 -2
- snowflake/cortex/_util.py +4 -4
- snowflake/ml/_internal/env_utils.py +5 -5
- snowflake/ml/_internal/exceptions/error_codes.py +2 -0
- snowflake/ml/_internal/utils/db_utils.py +50 -0
- snowflake/ml/_internal/utils/service_logger.py +63 -0
- snowflake/ml/_internal/utils/sql_identifier.py +25 -1
- snowflake/ml/data/_internal/arrow_ingestor.py +1 -11
- snowflake/ml/data/ingestor_utils.py +20 -10
- snowflake/ml/feature_store/access_manager.py +3 -3
- snowflake/ml/feature_store/feature_store.py +19 -2
- snowflake/ml/feature_store/feature_view.py +82 -28
- snowflake/ml/fileset/stage_fs.py +2 -1
- snowflake/ml/lineage/lineage_node.py +7 -2
- snowflake/ml/model/__init__.py +1 -2
- snowflake/ml/model/_client/model/model_version_impl.py +78 -9
- snowflake/ml/model/_client/ops/model_ops.py +89 -7
- snowflake/ml/model/_client/ops/service_ops.py +200 -91
- snowflake/ml/model/_client/service/model_deployment_spec.py +4 -0
- snowflake/ml/model/_client/service/model_deployment_spec_schema.py +1 -0
- snowflake/ml/model/_client/sql/_base.py +5 -0
- snowflake/ml/model/_client/sql/model.py +1 -0
- snowflake/ml/model/_client/sql/model_version.py +9 -5
- snowflake/ml/model/_client/sql/service.py +47 -13
- snowflake/ml/model/_model_composer/model_composer.py +11 -41
- snowflake/ml/model/_model_composer/model_manifest/model_manifest.py +29 -4
- snowflake/ml/model/_packager/model_env/model_env.py +4 -38
- snowflake/ml/model/_packager/model_handlers/_utils.py +106 -32
- snowflake/ml/model/_packager/model_handlers/catboost.py +26 -27
- snowflake/ml/model/_packager/model_handlers/huggingface_pipeline.py +3 -3
- snowflake/ml/model/_packager/model_handlers/lightgbm.py +21 -6
- snowflake/ml/model/_packager/model_handlers/mlflow.py +3 -5
- snowflake/ml/model/_packager/model_handlers/model_objective_utils.py +111 -58
- snowflake/ml/model/_packager/model_handlers/sentence_transformers.py +15 -8
- snowflake/ml/model/_packager/model_handlers/sklearn.py +50 -66
- snowflake/ml/model/_packager/model_handlers/snowmlmodel.py +36 -17
- snowflake/ml/model/_packager/model_handlers/xgboost.py +22 -7
- snowflake/ml/model/_packager/model_meta/model_meta.py +16 -45
- snowflake/ml/model/_packager/model_meta/model_meta_schema.py +1 -6
- snowflake/ml/model/_packager/model_packager.py +14 -10
- snowflake/ml/model/_packager/model_runtime/model_runtime.py +11 -0
- snowflake/ml/model/_signatures/snowpark_handler.py +3 -2
- snowflake/ml/model/type_hints.py +11 -152
- snowflake/ml/modeling/_internal/snowpark_implementations/distributed_hpo_trainer.py +0 -2
- snowflake/ml/modeling/_internal/snowpark_implementations/snowpark_trainer.py +17 -6
- snowflake/ml/modeling/_internal/snowpark_implementations/xgboost_external_memory_trainer.py +0 -1
- snowflake/ml/modeling/calibration/calibrated_classifier_cv.py +1 -0
- snowflake/ml/modeling/cluster/affinity_propagation.py +1 -0
- snowflake/ml/modeling/cluster/agglomerative_clustering.py +1 -0
- snowflake/ml/modeling/cluster/birch.py +1 -0
- snowflake/ml/modeling/cluster/bisecting_k_means.py +1 -0
- snowflake/ml/modeling/cluster/dbscan.py +1 -0
- snowflake/ml/modeling/cluster/feature_agglomeration.py +1 -0
- snowflake/ml/modeling/cluster/k_means.py +1 -0
- snowflake/ml/modeling/cluster/mean_shift.py +1 -0
- snowflake/ml/modeling/cluster/mini_batch_k_means.py +1 -0
- snowflake/ml/modeling/cluster/optics.py +1 -0
- snowflake/ml/modeling/cluster/spectral_biclustering.py +1 -0
- snowflake/ml/modeling/cluster/spectral_clustering.py +1 -0
- snowflake/ml/modeling/cluster/spectral_coclustering.py +1 -0
- snowflake/ml/modeling/compose/column_transformer.py +1 -0
- snowflake/ml/modeling/compose/transformed_target_regressor.py +1 -0
- snowflake/ml/modeling/covariance/elliptic_envelope.py +1 -0
- snowflake/ml/modeling/covariance/empirical_covariance.py +1 -0
- snowflake/ml/modeling/covariance/graphical_lasso.py +1 -0
- snowflake/ml/modeling/covariance/graphical_lasso_cv.py +1 -0
- snowflake/ml/modeling/covariance/ledoit_wolf.py +1 -0
- snowflake/ml/modeling/covariance/min_cov_det.py +1 -0
- snowflake/ml/modeling/covariance/oas.py +1 -0
- snowflake/ml/modeling/covariance/shrunk_covariance.py +1 -0
- snowflake/ml/modeling/decomposition/dictionary_learning.py +1 -0
- snowflake/ml/modeling/decomposition/factor_analysis.py +1 -0
- snowflake/ml/modeling/decomposition/fast_ica.py +1 -0
- snowflake/ml/modeling/decomposition/incremental_pca.py +1 -0
- snowflake/ml/modeling/decomposition/kernel_pca.py +1 -0
- snowflake/ml/modeling/decomposition/mini_batch_dictionary_learning.py +1 -0
- snowflake/ml/modeling/decomposition/mini_batch_sparse_pca.py +1 -0
- snowflake/ml/modeling/decomposition/pca.py +1 -0
- snowflake/ml/modeling/decomposition/sparse_pca.py +1 -0
- snowflake/ml/modeling/decomposition/truncated_svd.py +1 -0
- snowflake/ml/modeling/discriminant_analysis/linear_discriminant_analysis.py +1 -0
- snowflake/ml/modeling/discriminant_analysis/quadratic_discriminant_analysis.py +1 -0
- snowflake/ml/modeling/ensemble/ada_boost_classifier.py +1 -0
- snowflake/ml/modeling/ensemble/ada_boost_regressor.py +1 -0
- snowflake/ml/modeling/ensemble/bagging_classifier.py +1 -0
- snowflake/ml/modeling/ensemble/bagging_regressor.py +1 -0
- snowflake/ml/modeling/ensemble/extra_trees_classifier.py +1 -0
- snowflake/ml/modeling/ensemble/extra_trees_regressor.py +1 -0
- snowflake/ml/modeling/ensemble/gradient_boosting_classifier.py +1 -0
- snowflake/ml/modeling/ensemble/gradient_boosting_regressor.py +1 -0
- snowflake/ml/modeling/ensemble/hist_gradient_boosting_classifier.py +1 -0
- snowflake/ml/modeling/ensemble/hist_gradient_boosting_regressor.py +1 -0
- snowflake/ml/modeling/ensemble/isolation_forest.py +1 -0
- snowflake/ml/modeling/ensemble/random_forest_classifier.py +1 -0
- snowflake/ml/modeling/ensemble/random_forest_regressor.py +1 -0
- snowflake/ml/modeling/ensemble/stacking_regressor.py +1 -0
- snowflake/ml/modeling/ensemble/voting_classifier.py +1 -0
- snowflake/ml/modeling/ensemble/voting_regressor.py +1 -0
- snowflake/ml/modeling/feature_selection/generic_univariate_select.py +1 -0
- snowflake/ml/modeling/feature_selection/select_fdr.py +1 -0
- snowflake/ml/modeling/feature_selection/select_fpr.py +1 -0
- snowflake/ml/modeling/feature_selection/select_fwe.py +1 -0
- snowflake/ml/modeling/feature_selection/select_k_best.py +1 -0
- snowflake/ml/modeling/feature_selection/select_percentile.py +1 -0
- snowflake/ml/modeling/feature_selection/sequential_feature_selector.py +1 -0
- snowflake/ml/modeling/feature_selection/variance_threshold.py +1 -0
- snowflake/ml/modeling/gaussian_process/gaussian_process_classifier.py +1 -0
- snowflake/ml/modeling/gaussian_process/gaussian_process_regressor.py +1 -0
- snowflake/ml/modeling/impute/iterative_imputer.py +1 -0
- snowflake/ml/modeling/impute/knn_imputer.py +1 -0
- snowflake/ml/modeling/impute/missing_indicator.py +1 -0
- snowflake/ml/modeling/kernel_approximation/additive_chi2_sampler.py +1 -0
- snowflake/ml/modeling/kernel_approximation/nystroem.py +1 -0
- snowflake/ml/modeling/kernel_approximation/polynomial_count_sketch.py +1 -0
- snowflake/ml/modeling/kernel_approximation/rbf_sampler.py +1 -0
- snowflake/ml/modeling/kernel_approximation/skewed_chi2_sampler.py +1 -0
- snowflake/ml/modeling/kernel_ridge/kernel_ridge.py +1 -0
- snowflake/ml/modeling/lightgbm/lgbm_classifier.py +1 -0
- snowflake/ml/modeling/lightgbm/lgbm_regressor.py +1 -0
- snowflake/ml/modeling/linear_model/ard_regression.py +1 -0
- snowflake/ml/modeling/linear_model/bayesian_ridge.py +1 -0
- snowflake/ml/modeling/linear_model/elastic_net.py +1 -0
- snowflake/ml/modeling/linear_model/elastic_net_cv.py +1 -0
- snowflake/ml/modeling/linear_model/gamma_regressor.py +1 -0
- snowflake/ml/modeling/linear_model/huber_regressor.py +1 -0
- snowflake/ml/modeling/linear_model/lars.py +1 -0
- snowflake/ml/modeling/linear_model/lars_cv.py +1 -0
- snowflake/ml/modeling/linear_model/lasso.py +1 -0
- snowflake/ml/modeling/linear_model/lasso_cv.py +1 -0
- snowflake/ml/modeling/linear_model/lasso_lars.py +1 -0
- snowflake/ml/modeling/linear_model/lasso_lars_cv.py +1 -0
- snowflake/ml/modeling/linear_model/lasso_lars_ic.py +1 -0
- snowflake/ml/modeling/linear_model/linear_regression.py +1 -0
- snowflake/ml/modeling/linear_model/logistic_regression.py +1 -0
- snowflake/ml/modeling/linear_model/logistic_regression_cv.py +1 -0
- snowflake/ml/modeling/linear_model/multi_task_elastic_net.py +1 -0
- snowflake/ml/modeling/linear_model/multi_task_elastic_net_cv.py +1 -0
- snowflake/ml/modeling/linear_model/multi_task_lasso.py +1 -0
- snowflake/ml/modeling/linear_model/multi_task_lasso_cv.py +1 -0
- snowflake/ml/modeling/linear_model/orthogonal_matching_pursuit.py +1 -0
- snowflake/ml/modeling/linear_model/passive_aggressive_classifier.py +1 -0
- snowflake/ml/modeling/linear_model/passive_aggressive_regressor.py +1 -0
- snowflake/ml/modeling/linear_model/perceptron.py +1 -0
- snowflake/ml/modeling/linear_model/poisson_regressor.py +1 -0
- snowflake/ml/modeling/linear_model/ransac_regressor.py +1 -0
- snowflake/ml/modeling/linear_model/ridge.py +1 -0
- snowflake/ml/modeling/linear_model/ridge_classifier.py +1 -0
- snowflake/ml/modeling/linear_model/ridge_classifier_cv.py +1 -0
- snowflake/ml/modeling/linear_model/ridge_cv.py +1 -0
- snowflake/ml/modeling/linear_model/sgd_classifier.py +1 -0
- snowflake/ml/modeling/linear_model/sgd_one_class_svm.py +1 -0
- snowflake/ml/modeling/linear_model/sgd_regressor.py +1 -0
- snowflake/ml/modeling/linear_model/theil_sen_regressor.py +1 -0
- snowflake/ml/modeling/linear_model/tweedie_regressor.py +1 -0
- snowflake/ml/modeling/manifold/isomap.py +1 -0
- snowflake/ml/modeling/manifold/mds.py +1 -0
- snowflake/ml/modeling/manifold/spectral_embedding.py +1 -0
- snowflake/ml/modeling/manifold/tsne.py +1 -0
- snowflake/ml/modeling/metrics/metrics_utils.py +2 -2
- snowflake/ml/modeling/metrics/ranking.py +0 -3
- snowflake/ml/modeling/metrics/regression.py +0 -3
- snowflake/ml/modeling/mixture/bayesian_gaussian_mixture.py +1 -0
- snowflake/ml/modeling/mixture/gaussian_mixture.py +1 -0
- snowflake/ml/modeling/multiclass/one_vs_one_classifier.py +1 -0
- snowflake/ml/modeling/multiclass/one_vs_rest_classifier.py +1 -0
- snowflake/ml/modeling/multiclass/output_code_classifier.py +1 -0
- snowflake/ml/modeling/naive_bayes/bernoulli_nb.py +1 -0
- snowflake/ml/modeling/naive_bayes/categorical_nb.py +1 -0
- snowflake/ml/modeling/naive_bayes/complement_nb.py +1 -0
- snowflake/ml/modeling/naive_bayes/gaussian_nb.py +1 -0
- snowflake/ml/modeling/naive_bayes/multinomial_nb.py +1 -0
- snowflake/ml/modeling/neighbors/k_neighbors_classifier.py +1 -0
- snowflake/ml/modeling/neighbors/k_neighbors_regressor.py +1 -0
- snowflake/ml/modeling/neighbors/kernel_density.py +1 -0
- snowflake/ml/modeling/neighbors/local_outlier_factor.py +1 -0
- snowflake/ml/modeling/neighbors/nearest_centroid.py +1 -0
- snowflake/ml/modeling/neighbors/nearest_neighbors.py +1 -0
- snowflake/ml/modeling/neighbors/neighborhood_components_analysis.py +1 -0
- snowflake/ml/modeling/neighbors/radius_neighbors_classifier.py +1 -0
- snowflake/ml/modeling/neighbors/radius_neighbors_regressor.py +1 -0
- snowflake/ml/modeling/neural_network/bernoulli_rbm.py +1 -0
- snowflake/ml/modeling/neural_network/mlp_classifier.py +1 -0
- snowflake/ml/modeling/neural_network/mlp_regressor.py +1 -0
- snowflake/ml/modeling/pipeline/pipeline.py +0 -1
- snowflake/ml/modeling/preprocessing/polynomial_features.py +1 -0
- snowflake/ml/modeling/semi_supervised/label_propagation.py +1 -0
- snowflake/ml/modeling/semi_supervised/label_spreading.py +1 -0
- snowflake/ml/modeling/svm/linear_svc.py +1 -0
- snowflake/ml/modeling/svm/linear_svr.py +1 -0
- snowflake/ml/modeling/svm/nu_svc.py +1 -0
- snowflake/ml/modeling/svm/nu_svr.py +1 -0
- snowflake/ml/modeling/svm/svc.py +1 -0
- snowflake/ml/modeling/svm/svr.py +1 -0
- snowflake/ml/modeling/tree/decision_tree_classifier.py +1 -0
- snowflake/ml/modeling/tree/decision_tree_regressor.py +1 -0
- snowflake/ml/modeling/tree/extra_tree_classifier.py +1 -0
- snowflake/ml/modeling/tree/extra_tree_regressor.py +1 -0
- snowflake/ml/modeling/xgboost/xgb_classifier.py +1 -0
- snowflake/ml/modeling/xgboost/xgb_regressor.py +1 -0
- snowflake/ml/modeling/xgboost/xgbrf_classifier.py +1 -0
- snowflake/ml/modeling/xgboost/xgbrf_regressor.py +1 -0
- snowflake/ml/monitoring/_client/model_monitor.py +126 -0
- snowflake/ml/monitoring/_client/model_monitor_manager.py +361 -0
- snowflake/ml/monitoring/_client/model_monitor_version.py +1 -0
- snowflake/ml/monitoring/_client/monitor_sql_client.py +1335 -0
- snowflake/ml/monitoring/_client/queries/record_count.ssql +14 -0
- snowflake/ml/monitoring/_client/queries/rmse.ssql +28 -0
- snowflake/ml/monitoring/entities/model_monitor_config.py +28 -0
- snowflake/ml/monitoring/entities/model_monitor_interval.py +46 -0
- snowflake/ml/monitoring/entities/output_score_type.py +90 -0
- snowflake/ml/registry/_manager/model_manager.py +4 -4
- snowflake/ml/registry/registry.py +165 -6
- snowflake/ml/version.py +1 -1
- {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.3.dist-info}/METADATA +24 -9
- {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.3.dist-info}/RECORD +225 -249
- {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.3.dist-info}/WHEEL +1 -1
- snowflake/ml/_internal/container_services/image_registry/credential.py +0 -84
- snowflake/ml/_internal/container_services/image_registry/http_client.py +0 -127
- snowflake/ml/_internal/container_services/image_registry/imagelib.py +0 -400
- snowflake/ml/_internal/container_services/image_registry/registry_client.py +0 -212
- snowflake/ml/_internal/utils/log_stream_processor.py +0 -30
- snowflake/ml/_internal/utils/session_token_manager.py +0 -46
- snowflake/ml/_internal/utils/spcs_attribution_utils.py +0 -122
- snowflake/ml/_internal/utils/uri.py +0 -77
- snowflake/ml/model/_api.py +0 -568
- snowflake/ml/model/_deploy_client/image_builds/base_image_builder.py +0 -12
- snowflake/ml/model/_deploy_client/image_builds/client_image_builder.py +0 -249
- snowflake/ml/model/_deploy_client/image_builds/docker_context.py +0 -130
- snowflake/ml/model/_deploy_client/image_builds/gunicorn_run.sh +0 -36
- snowflake/ml/model/_deploy_client/image_builds/inference_server/main.py +0 -268
- snowflake/ml/model/_deploy_client/image_builds/server_image_builder.py +0 -215
- snowflake/ml/model/_deploy_client/image_builds/templates/dockerfile_template +0 -53
- snowflake/ml/model/_deploy_client/image_builds/templates/image_build_job_spec_template +0 -38
- snowflake/ml/model/_deploy_client/image_builds/templates/kaniko_shell_script_template +0 -105
- snowflake/ml/model/_deploy_client/snowservice/deploy.py +0 -611
- snowflake/ml/model/_deploy_client/snowservice/deploy_options.py +0 -116
- snowflake/ml/model/_deploy_client/snowservice/instance_types.py +0 -10
- snowflake/ml/model/_deploy_client/snowservice/templates/service_spec_template +0 -28
- snowflake/ml/model/_deploy_client/snowservice/templates/service_spec_template_with_model +0 -21
- snowflake/ml/model/_deploy_client/utils/constants.py +0 -48
- snowflake/ml/model/_deploy_client/utils/snowservice_client.py +0 -280
- snowflake/ml/model/_deploy_client/warehouse/deploy.py +0 -202
- snowflake/ml/model/_deploy_client/warehouse/infer_template.py +0 -99
- snowflake/ml/model/_packager/model_handlers/llm.py +0 -269
- snowflake/ml/model/_packager/model_meta/_core_requirements.py +0 -11
- snowflake/ml/model/deploy_platforms.py +0 -6
- snowflake/ml/model/models/llm.py +0 -106
- snowflake/ml/monitoring/monitor.py +0 -203
- snowflake/ml/registry/_initial_schema.py +0 -142
- snowflake/ml/registry/_schema.py +0 -82
- snowflake/ml/registry/_schema_upgrade_plans.py +0 -116
- snowflake/ml/registry/_schema_version_manager.py +0 -163
- snowflake/ml/registry/model_registry.py +0 -2048
- {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.3.dist-info}/LICENSE.txt +0 -0
- {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.3.dist-info}/top_level.txt +0 -0
snowflake/cortex/__init__.py
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
from snowflake.cortex._classify_text import ClassifyText
|
2
2
|
from snowflake.cortex._complete import Complete, CompleteOptions
|
3
|
+
from snowflake.cortex._embed_text_768 import EmbedText768
|
4
|
+
from snowflake.cortex._embed_text_1024 import EmbedText1024
|
3
5
|
from snowflake.cortex._extract_answer import ExtractAnswer
|
4
6
|
from snowflake.cortex._sentiment import Sentiment
|
5
7
|
from snowflake.cortex._summarize import Summarize
|
@@ -9,6 +11,8 @@ __all__ = [
|
|
9
11
|
"ClassifyText",
|
10
12
|
"Complete",
|
11
13
|
"CompleteOptions",
|
14
|
+
"EmbedText768",
|
15
|
+
"EmbedText1024",
|
12
16
|
"ExtractAnswer",
|
13
17
|
"Sentiment",
|
14
18
|
"Summarize",
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import List, Optional, Union
|
1
|
+
from typing import List, Optional, Union, cast
|
2
2
|
|
3
3
|
from snowflake import snowpark
|
4
4
|
from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
|
@@ -33,4 +33,4 @@ def _classify_text_impl(
|
|
33
33
|
categories: Union[List[str], snowpark.Column],
|
34
34
|
session: Optional[snowpark.Session] = None,
|
35
35
|
) -> Union[str, snowpark.Column]:
|
36
|
-
return call_sql_function(function, session, str_input, categories)
|
36
|
+
return cast(Union[str, snowpark.Column], call_sql_function(function, session, str_input, categories))
|
@@ -0,0 +1,37 @@
|
|
1
|
+
from typing import List, Optional, Union, cast
|
2
|
+
|
3
|
+
from snowflake import snowpark
|
4
|
+
from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
|
5
|
+
from snowflake.ml._internal import telemetry
|
6
|
+
|
7
|
+
|
8
|
+
@telemetry.send_api_usage_telemetry(
|
9
|
+
project=CORTEX_FUNCTIONS_TELEMETRY_PROJECT,
|
10
|
+
)
|
11
|
+
def EmbedText1024(
|
12
|
+
model: Union[str, snowpark.Column],
|
13
|
+
text: Union[str, snowpark.Column],
|
14
|
+
session: Optional[snowpark.Session] = None,
|
15
|
+
) -> Union[List[float], snowpark.Column]:
|
16
|
+
"""TextEmbed calls into the LLM inference service to embed the text.
|
17
|
+
|
18
|
+
Args:
|
19
|
+
model: A Column of strings representing the model to use for embedding. The value
|
20
|
+
of the strings must be within the SUPPORTED_MODELS list.
|
21
|
+
text: A Column of strings representing input text.
|
22
|
+
session: The snowpark session to use. Will be inferred by context if not specified.
|
23
|
+
|
24
|
+
Returns:
|
25
|
+
A column of vectors containing embeddings.
|
26
|
+
"""
|
27
|
+
|
28
|
+
return _embed_text_1024_impl("snowflake.cortex.embed_text_1024", model, text, session=session)
|
29
|
+
|
30
|
+
|
31
|
+
def _embed_text_1024_impl(
|
32
|
+
function: str,
|
33
|
+
model: Union[str, snowpark.Column],
|
34
|
+
text: Union[str, snowpark.Column],
|
35
|
+
session: Optional[snowpark.Session] = None,
|
36
|
+
) -> Union[List[float], snowpark.Column]:
|
37
|
+
return cast(Union[List[float], snowpark.Column], call_sql_function(function, session, model, text))
|
@@ -0,0 +1,37 @@
|
|
1
|
+
from typing import List, Optional, Union, cast
|
2
|
+
|
3
|
+
from snowflake import snowpark
|
4
|
+
from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
|
5
|
+
from snowflake.ml._internal import telemetry
|
6
|
+
|
7
|
+
|
8
|
+
@telemetry.send_api_usage_telemetry(
|
9
|
+
project=CORTEX_FUNCTIONS_TELEMETRY_PROJECT,
|
10
|
+
)
|
11
|
+
def EmbedText768(
|
12
|
+
model: Union[str, snowpark.Column],
|
13
|
+
text: Union[str, snowpark.Column],
|
14
|
+
session: Optional[snowpark.Session] = None,
|
15
|
+
) -> Union[List[float], snowpark.Column]:
|
16
|
+
"""TextEmbed calls into the LLM inference service to embed the text.
|
17
|
+
|
18
|
+
Args:
|
19
|
+
model: A Column of strings representing the model to use for embedding. The value
|
20
|
+
of the strings must be within the SUPPORTED_MODELS list.
|
21
|
+
text: A Column of strings representing input text.
|
22
|
+
session: The snowpark session to use. Will be inferred by context if not specified.
|
23
|
+
|
24
|
+
Returns:
|
25
|
+
A column of vectors containing embeddings.
|
26
|
+
"""
|
27
|
+
|
28
|
+
return _embed_text_768_impl("snowflake.cortex.embed_text_768", model, text, session=session)
|
29
|
+
|
30
|
+
|
31
|
+
def _embed_text_768_impl(
|
32
|
+
function: str,
|
33
|
+
model: Union[str, snowpark.Column],
|
34
|
+
text: Union[str, snowpark.Column],
|
35
|
+
session: Optional[snowpark.Session] = None,
|
36
|
+
) -> Union[List[float], snowpark.Column]:
|
37
|
+
return cast(Union[List[float], snowpark.Column], call_sql_function(function, session, model, text))
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import Optional, Union
|
1
|
+
from typing import Optional, Union, cast
|
2
2
|
|
3
3
|
from snowflake import snowpark
|
4
4
|
from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
|
@@ -33,4 +33,4 @@ def _extract_answer_impl(
|
|
33
33
|
question: Union[str, snowpark.Column],
|
34
34
|
session: Optional[snowpark.Session] = None,
|
35
35
|
) -> Union[str, snowpark.Column]:
|
36
|
-
return call_sql_function(function, session, from_text, question)
|
36
|
+
return cast(Union[str, snowpark.Column], call_sql_function(function, session, from_text, question))
|
snowflake/cortex/_sentiment.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import Optional, Union
|
1
|
+
from typing import Optional, Union, cast
|
2
2
|
|
3
3
|
from snowflake import snowpark
|
4
4
|
from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
|
@@ -30,4 +30,4 @@ def _sentiment_impl(
|
|
30
30
|
output = call_sql_function(function, session, text)
|
31
31
|
if isinstance(output, snowpark.Column):
|
32
32
|
return output
|
33
|
-
return float(output)
|
33
|
+
return float(cast(str, output))
|
snowflake/cortex/_summarize.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import Optional, Union
|
1
|
+
from typing import Optional, Union, cast
|
2
2
|
|
3
3
|
from snowflake import snowpark
|
4
4
|
from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
|
@@ -30,4 +30,4 @@ def _summarize_impl(
|
|
30
30
|
text: Union[str, snowpark.Column],
|
31
31
|
session: Optional[snowpark.Session] = None,
|
32
32
|
) -> Union[str, snowpark.Column]:
|
33
|
-
return call_sql_function(function, session, text)
|
33
|
+
return cast(Union[str, snowpark.Column], call_sql_function(function, session, text))
|
snowflake/cortex/_translate.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import Optional, Union
|
1
|
+
from typing import Optional, Union, cast
|
2
2
|
|
3
3
|
from snowflake import snowpark
|
4
4
|
from snowflake.cortex._util import CORTEX_FUNCTIONS_TELEMETRY_PROJECT, call_sql_function
|
@@ -36,4 +36,4 @@ def _translate_impl(
|
|
36
36
|
to_language: Union[str, snowpark.Column],
|
37
37
|
session: Optional[snowpark.Session] = None,
|
38
38
|
) -> Union[str, snowpark.Column]:
|
39
|
-
return call_sql_function(function, session, text, from_language, to_language)
|
39
|
+
return cast(Union[str, snowpark.Column], call_sql_function(function, session, text, from_language, to_language))
|
snowflake/cortex/_util.py
CHANGED
@@ -24,7 +24,7 @@ def call_sql_function(
|
|
24
24
|
function: str,
|
25
25
|
session: Optional[snowpark.Session],
|
26
26
|
*args: Union[str, List[str], snowpark.Column, Dict[str, Union[int, float]]],
|
27
|
-
) -> Union[str, snowpark.Column]:
|
27
|
+
) -> Union[str, List[float], snowpark.Column]:
|
28
28
|
handle_as_column = False
|
29
29
|
|
30
30
|
for arg in args:
|
@@ -32,9 +32,9 @@ def call_sql_function(
|
|
32
32
|
handle_as_column = True
|
33
33
|
|
34
34
|
if handle_as_column:
|
35
|
-
return cast(Union[str, snowpark.Column], _call_sql_function_column(function, *args))
|
35
|
+
return cast(Union[str, List[float], snowpark.Column], _call_sql_function_column(function, *args))
|
36
36
|
return cast(
|
37
|
-
Union[str, snowpark.Column],
|
37
|
+
Union[str, List[float], snowpark.Column],
|
38
38
|
_call_sql_function_immediate(function, session, *args),
|
39
39
|
)
|
40
40
|
|
@@ -49,7 +49,7 @@ def _call_sql_function_immediate(
|
|
49
49
|
function: str,
|
50
50
|
session: Optional[snowpark.Session],
|
51
51
|
*args: Union[str, List[str], snowpark.Column, Dict[str, Union[int, float]]],
|
52
|
-
) -> str:
|
52
|
+
) -> Union[str, List[float]]:
|
53
53
|
session = session or context.get_active_session()
|
54
54
|
if session is None:
|
55
55
|
raise SnowflakeAuthenticationException(
|
@@ -9,7 +9,7 @@ from importlib import metadata as importlib_metadata
|
|
9
9
|
from typing import Any, DefaultDict, Dict, List, Optional, Tuple
|
10
10
|
|
11
11
|
import yaml
|
12
|
-
from packaging import requirements, specifiers,
|
12
|
+
from packaging import requirements, specifiers, version
|
13
13
|
|
14
14
|
import snowflake.connector
|
15
15
|
from snowflake.ml._internal import env as snowml_env
|
@@ -54,15 +54,12 @@ def _validate_pip_requirement_string(req_str: str) -> requirements.Requirement:
|
|
54
54
|
"""
|
55
55
|
try:
|
56
56
|
r = requirements.Requirement(req_str)
|
57
|
-
r.name = packaging_utils.canonicalize_name(r.name)
|
58
57
|
|
59
58
|
if r.name == "python":
|
60
59
|
raise ValueError("Don't specify python as a dependency, use python version argument instead.")
|
61
60
|
except requirements.InvalidRequirement:
|
62
61
|
raise ValueError(f"Invalid package requirement {req_str} found.")
|
63
62
|
|
64
|
-
if r.marker:
|
65
|
-
raise ValueError("Markers is not supported in conda dependency.")
|
66
63
|
return r
|
67
64
|
|
68
65
|
|
@@ -84,6 +81,8 @@ def _validate_conda_dependency_string(dep_str: str) -> Tuple[str, requirements.R
|
|
84
81
|
channel_str, _, requirement_str = dep_str.rpartition("::")
|
85
82
|
r = _validate_pip_requirement_string(requirement_str)
|
86
83
|
if channel_str != "pip":
|
84
|
+
if r.marker:
|
85
|
+
raise ValueError("Markers is not supported in conda dependency.")
|
87
86
|
if r.extras:
|
88
87
|
raise ValueError("Extras is not supported in conda dependency.")
|
89
88
|
if r.url:
|
@@ -221,7 +220,7 @@ def get_local_installed_version_of_pip_package(pip_req: requirements.Requirement
|
|
221
220
|
else:
|
222
221
|
return pip_req
|
223
222
|
new_pip_req = copy.deepcopy(pip_req)
|
224
|
-
new_pip_req.specifier = specifiers.SpecifierSet(specifiers=f"=={local_dist_version}")
|
223
|
+
new_pip_req.specifier = specifiers.SpecifierSet(specifiers=f"=={version.parse(local_dist_version).base_version}")
|
225
224
|
if not pip_req.specifier.contains(local_dist_version):
|
226
225
|
warnings.warn(
|
227
226
|
f"Package requirement {str(pip_req)} specified, while version {local_dist_version} is installed. "
|
@@ -513,6 +512,7 @@ def save_conda_env_file(
|
|
513
512
|
)
|
514
513
|
|
515
514
|
with open(path, "w", encoding="utf-8") as f:
|
515
|
+
yaml.SafeDumper.ignore_aliases = lambda *args: True # type: ignore[method-assign]
|
516
516
|
yaml.safe_dump(env, stream=f, default_flow_style=False)
|
517
517
|
|
518
518
|
|
@@ -0,0 +1,50 @@
|
|
1
|
+
from enum import Enum
|
2
|
+
from typing import Any, Dict, Optional
|
3
|
+
|
4
|
+
from snowflake.ml._internal.utils import query_result_checker, sql_identifier
|
5
|
+
from snowflake.snowpark import session
|
6
|
+
|
7
|
+
MAX_IDENTIFIER_LENGTH = 255
|
8
|
+
|
9
|
+
|
10
|
+
class SnowflakeDbObjectType(Enum):
|
11
|
+
TABLE = "TABLE"
|
12
|
+
WAREHOUSE = "WAREHOUSE"
|
13
|
+
|
14
|
+
|
15
|
+
def db_object_exists(
|
16
|
+
session: session.Session,
|
17
|
+
object_type: SnowflakeDbObjectType,
|
18
|
+
object_name: sql_identifier.SqlIdentifier,
|
19
|
+
*,
|
20
|
+
database_name: Optional[sql_identifier.SqlIdentifier] = None,
|
21
|
+
schema_name: Optional[sql_identifier.SqlIdentifier] = None,
|
22
|
+
statement_params: Optional[Dict[str, Any]] = None,
|
23
|
+
) -> bool:
|
24
|
+
"""Check if object exists in database.
|
25
|
+
|
26
|
+
Args:
|
27
|
+
session: Active Snowpark Session.
|
28
|
+
object_type: Type of object to search for.
|
29
|
+
object_name: Name of object to search for.
|
30
|
+
database_name: Optional database name to search in. Only used if both schema is also provided.
|
31
|
+
schema_name: Optional schema to search in.
|
32
|
+
statement_params: Optional set of statement_params to include with queries.
|
33
|
+
|
34
|
+
Returns:
|
35
|
+
boolean indicating whether object exists.
|
36
|
+
"""
|
37
|
+
optional_in_clause = ""
|
38
|
+
if database_name and schema_name:
|
39
|
+
optional_in_clause = f" IN {database_name}.{schema_name}"
|
40
|
+
|
41
|
+
result = (
|
42
|
+
query_result_checker.SqlResultValidator(
|
43
|
+
session,
|
44
|
+
f"""SHOW {object_type.value}S LIKE '{object_name}'{optional_in_clause}""",
|
45
|
+
statement_params=statement_params,
|
46
|
+
)
|
47
|
+
.has_column("name", allow_empty=True) # TODO: Check this is actually what is returned from server
|
48
|
+
.validate()
|
49
|
+
)
|
50
|
+
return len(result) == 1
|
@@ -0,0 +1,63 @@
|
|
1
|
+
import enum
|
2
|
+
import logging
|
3
|
+
import sys
|
4
|
+
|
5
|
+
|
6
|
+
class LogColor(enum.Enum):
|
7
|
+
GREY = "\x1b[38;20m"
|
8
|
+
RED = "\x1b[31;20m"
|
9
|
+
BOLD_RED = "\x1b[31;1m"
|
10
|
+
YELLOW = "\x1b[33;20m"
|
11
|
+
BLUE = "\x1b[34;20m"
|
12
|
+
GREEN = "\x1b[32;20m"
|
13
|
+
|
14
|
+
|
15
|
+
class CustomFormatter(logging.Formatter):
|
16
|
+
|
17
|
+
reset = "\x1b[0m"
|
18
|
+
log_format = "%(name)s [%(asctime)s] [%(levelname)s] %(message)s"
|
19
|
+
|
20
|
+
def __init__(self, info_color: LogColor) -> None:
|
21
|
+
super().__init__()
|
22
|
+
self.level_colors = {
|
23
|
+
logging.DEBUG: LogColor.GREY.value,
|
24
|
+
logging.INFO: info_color.value,
|
25
|
+
logging.WARNING: LogColor.YELLOW.value,
|
26
|
+
logging.ERROR: LogColor.RED.value,
|
27
|
+
logging.CRITICAL: LogColor.BOLD_RED.value,
|
28
|
+
}
|
29
|
+
|
30
|
+
def format(self, record: logging.LogRecord) -> str:
|
31
|
+
# default to DEBUG color
|
32
|
+
fmt = self.level_colors.get(record.levelno, self.level_colors[logging.DEBUG]) + self.log_format + self.reset
|
33
|
+
formatter = logging.Formatter(fmt)
|
34
|
+
|
35
|
+
# split the log message by lines and format each line individually
|
36
|
+
original_message = record.getMessage()
|
37
|
+
message_lines = original_message.splitlines()
|
38
|
+
formatted_lines = [
|
39
|
+
formatter.format(
|
40
|
+
logging.LogRecord(
|
41
|
+
name=record.name,
|
42
|
+
level=record.levelno,
|
43
|
+
pathname=record.pathname,
|
44
|
+
lineno=record.lineno,
|
45
|
+
msg=line,
|
46
|
+
args=None,
|
47
|
+
exc_info=None,
|
48
|
+
)
|
49
|
+
)
|
50
|
+
for line in message_lines
|
51
|
+
]
|
52
|
+
|
53
|
+
return "\n".join(formatted_lines)
|
54
|
+
|
55
|
+
|
56
|
+
def get_logger(logger_name: str, info_color: LogColor) -> logging.Logger:
|
57
|
+
logger = logging.getLogger(logger_name)
|
58
|
+
logger.setLevel(logging.INFO)
|
59
|
+
handler = logging.StreamHandler(sys.stdout)
|
60
|
+
handler.setLevel(logging.INFO)
|
61
|
+
handler.setFormatter(CustomFormatter(info_color))
|
62
|
+
logger.addHandler(handler)
|
63
|
+
return logger
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from typing import List, Optional, Tuple
|
1
|
+
from typing import List, Optional, Tuple, Union
|
2
2
|
|
3
3
|
from snowflake.ml._internal.utils import identifier
|
4
4
|
|
@@ -92,3 +92,27 @@ def parse_fully_qualified_name(
|
|
92
92
|
SqlIdentifier(schema) if schema else None,
|
93
93
|
SqlIdentifier(object),
|
94
94
|
)
|
95
|
+
|
96
|
+
|
97
|
+
def get_fully_qualified_name(
|
98
|
+
db: Union[SqlIdentifier, str, None],
|
99
|
+
schema: Union[SqlIdentifier, str, None],
|
100
|
+
object: Union[SqlIdentifier, str],
|
101
|
+
session_db: Optional[str] = None,
|
102
|
+
session_schema: Optional[str] = None,
|
103
|
+
) -> str:
|
104
|
+
db_name: Optional[SqlIdentifier] = None
|
105
|
+
schema_name: Optional[SqlIdentifier] = None
|
106
|
+
if not db and session_db:
|
107
|
+
db_name = SqlIdentifier(session_db)
|
108
|
+
elif isinstance(db, str):
|
109
|
+
db_name = SqlIdentifier(db)
|
110
|
+
if not schema and session_schema:
|
111
|
+
schema_name = SqlIdentifier(session_schema)
|
112
|
+
elif isinstance(schema, str):
|
113
|
+
schema_name = SqlIdentifier(schema)
|
114
|
+
return identifier.get_schema_level_object_identifier(
|
115
|
+
db=db_name.identifier() if db_name else None,
|
116
|
+
schema=schema_name.identifier() if schema_name else None,
|
117
|
+
object_name=object.identifier() if isinstance(object, SqlIdentifier) else SqlIdentifier(object).identifier(),
|
118
|
+
)
|
@@ -11,7 +11,6 @@ import pyarrow as pa
|
|
11
11
|
import pyarrow.dataset as pds
|
12
12
|
|
13
13
|
from snowflake import snowpark
|
14
|
-
from snowflake.connector import result_batch
|
15
14
|
from snowflake.ml.data import data_ingestor, data_source, ingestor_utils
|
16
15
|
|
17
16
|
_EMPTY_RECORD_BATCH = pa.RecordBatch.from_arrays([], [])
|
@@ -140,16 +139,7 @@ class ArrowIngestor(data_ingestor.DataIngestor):
|
|
140
139
|
# We may be able to optimize this by splitting the result batches into
|
141
140
|
# in-memory (first batch) and file URLs (subsequent batches) and creating a
|
142
141
|
# union dataset.
|
143
|
-
|
144
|
-
sources.extend(
|
145
|
-
b.to_arrow(self._session.connection)
|
146
|
-
if isinstance(b, result_batch.ArrowResultBatch)
|
147
|
-
else b.to_arrow()
|
148
|
-
for b in result_batches
|
149
|
-
)
|
150
|
-
# HACK: Mitigate typing inconsistencies in Snowpark results
|
151
|
-
if len(sources) > 0:
|
152
|
-
sources = [_cast_if_needed(s, sources[-1].schema) for s in sources]
|
142
|
+
sources.append(_cast_if_needed(ingestor_utils.get_dataframe_arrow_table(self._session, source)))
|
153
143
|
source_format = None # Arrow Dataset expects "None" for in-memory datasets
|
154
144
|
else:
|
155
145
|
raise RuntimeError(f"Unsupported data source type: {type(source)}")
|
@@ -1,19 +1,17 @@
|
|
1
1
|
from typing import List, Optional
|
2
2
|
|
3
3
|
import fsspec
|
4
|
+
import pyarrow as pa
|
4
5
|
|
5
6
|
from snowflake import snowpark
|
6
|
-
from snowflake.connector import result_batch
|
7
|
+
from snowflake.connector import cursor as sf_cursor, result_batch
|
7
8
|
from snowflake.ml.data import data_source
|
8
9
|
from snowflake.ml.fileset import snowfs
|
9
10
|
|
10
11
|
_TARGET_FILE_SIZE = 32 * 2**20 # The max file size for data loading.
|
11
12
|
|
12
13
|
|
13
|
-
def
|
14
|
-
session: snowpark.Session, df_info: data_source.DataFrameInfo
|
15
|
-
) -> List[result_batch.ResultBatch]:
|
16
|
-
"""Retrieve the ResultBatches for a given query"""
|
14
|
+
def _get_dataframe_cursor(session: snowpark.Session, df_info: data_source.DataFrameInfo) -> sf_cursor.SnowflakeCursor:
|
17
15
|
cursor = session._conn._cursor
|
18
16
|
|
19
17
|
if df_info.query_id:
|
@@ -29,12 +27,24 @@ def get_dataframe_result_batches(
|
|
29
27
|
if cursor._prefetch_hook is None:
|
30
28
|
raise RuntimeError("Loading data from result query failed unexpectedly. Please contact Snowflake support.")
|
31
29
|
cursor._prefetch_hook()
|
30
|
+
|
31
|
+
return cursor
|
32
|
+
|
33
|
+
|
34
|
+
def get_dataframe_result_batches(
|
35
|
+
session: snowpark.Session, df_info: data_source.DataFrameInfo
|
36
|
+
) -> List[result_batch.ResultBatch]:
|
37
|
+
"""Retrieve the ResultBatches for a given query"""
|
38
|
+
cursor = _get_dataframe_cursor(session, df_info)
|
32
39
|
batches = cursor.get_result_batches()
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
40
|
+
return batches or []
|
41
|
+
|
42
|
+
|
43
|
+
def get_dataframe_arrow_table(session: snowpark.Session, df_info: data_source.DataFrameInfo) -> pa.Table:
|
44
|
+
"""Retrieve the full in-memory result for a given query"""
|
45
|
+
cursor = _get_dataframe_cursor(session, df_info)
|
46
|
+
table = cursor.fetch_arrow_all() # type: ignore[call-overload]
|
47
|
+
return table
|
38
48
|
|
39
49
|
|
40
50
|
def get_dataset_filesystem(
|
@@ -30,6 +30,7 @@ class _Privilege:
|
|
30
30
|
object_name: str
|
31
31
|
privileges: List[str]
|
32
32
|
scope: Optional[str] = None
|
33
|
+
optional: bool = False
|
33
34
|
|
34
35
|
|
35
36
|
@dataclass(frozen=True)
|
@@ -72,8 +73,7 @@ _PRE_INIT_PRIVILEGES: Dict[_FeatureStoreRole, List[_Privilege]] = {
|
|
72
73
|
_Privilege("VIEW", _ALL_OBJECTS, ["SELECT", "REFERENCES"], "SCHEMA {database}.{schema}"),
|
73
74
|
_Privilege("TABLE", _ALL_OBJECTS, ["SELECT", "REFERENCES"], "SCHEMA {database}.{schema}"),
|
74
75
|
_Privilege("DATASET", _ALL_OBJECTS, ["USAGE"], "SCHEMA {database}.{schema}"),
|
75
|
-
|
76
|
-
# _Privilege("WAREHOUSE", "{warehouse}", ["USAGE"]),
|
76
|
+
_Privilege("WAREHOUSE", "{warehouse}", ["USAGE"], optional=True),
|
77
77
|
],
|
78
78
|
_FeatureStoreRole.NONE: [],
|
79
79
|
}
|
@@ -109,7 +109,7 @@ def _grant_privileges(
|
|
109
109
|
query += f" TO ROLE {role_name}"
|
110
110
|
session.sql(query).collect()
|
111
111
|
except exceptions.SnowparkSQLException as e:
|
112
|
-
if any(
|
112
|
+
if p.optional or any(
|
113
113
|
s in e.message
|
114
114
|
for s in (
|
115
115
|
"Ask your account admin",
|
@@ -122,6 +122,14 @@ _DT_OR_VIEW_QUERY_PATTERN = re.compile(
|
|
122
122
|
flags=re.DOTALL | re.IGNORECASE | re.X,
|
123
123
|
)
|
124
124
|
|
125
|
+
_DT_INITIALIZE_PATTERN = re.compile(
|
126
|
+
r"""CREATE\ DYNAMIC\ TABLE\ .*
|
127
|
+
initialize\ =\ '(?P<initialize>.*)'\ .*?
|
128
|
+
AS\ .*
|
129
|
+
""",
|
130
|
+
flags=re.DOTALL | re.IGNORECASE | re.X,
|
131
|
+
)
|
132
|
+
|
125
133
|
_LIST_FEATURE_VIEW_SCHEMA = StructType(
|
126
134
|
[
|
127
135
|
StructField("name", StringType()),
|
@@ -565,11 +573,15 @@ class FeatureStore:
|
|
565
573
|
tagging_clause_str = ",\n".join(tagging_clause)
|
566
574
|
|
567
575
|
def create_col_desc(col: StructField) -> str:
|
568
|
-
desc = feature_view.feature_descs.get(SqlIdentifier(col.name), None)
|
576
|
+
desc = feature_view.feature_descs.get(SqlIdentifier(col.name), None) # type: ignore[union-attr]
|
569
577
|
desc = "" if desc is None else f"COMMENT '{desc}'"
|
570
578
|
return f"{col.name} {desc}"
|
571
579
|
|
572
|
-
column_descs =
|
580
|
+
column_descs = (
|
581
|
+
", ".join([f"{create_col_desc(col)}" for col in feature_view.output_schema.fields])
|
582
|
+
if feature_view.feature_descs is not None
|
583
|
+
else ""
|
584
|
+
)
|
573
585
|
|
574
586
|
if refresh_freq is not None:
|
575
587
|
schedule_task = refresh_freq != "DOWNSTREAM" and timeparse(refresh_freq) is None
|
@@ -1819,6 +1831,7 @@ class FeatureStore:
|
|
1819
1831
|
)
|
1820
1832
|
WAREHOUSE = {warehouse}
|
1821
1833
|
REFRESH_MODE = {feature_view.refresh_mode}
|
1834
|
+
INITIALIZE = {feature_view.initialize}
|
1822
1835
|
AS {feature_view.query}
|
1823
1836
|
"""
|
1824
1837
|
self._session.sql(query).collect(block=block, statement_params=self._telemetry_stmp)
|
@@ -2293,6 +2306,8 @@ class FeatureStore:
|
|
2293
2306
|
entities = [find_and_compose_entity(n) for n in fv_metadata.entities]
|
2294
2307
|
ts_col = fv_metadata.timestamp_col
|
2295
2308
|
timestamp_col = ts_col if ts_col not in _LEGACY_TIMESTAMP_COL_PLACEHOLDER_VALS else None
|
2309
|
+
re_initialize = re.match(_DT_INITIALIZE_PATTERN, row["text"])
|
2310
|
+
initialize = re_initialize.group("initialize") if re_initialize is not None else "ON_CREATE"
|
2296
2311
|
|
2297
2312
|
fv = FeatureView._construct_feature_view(
|
2298
2313
|
name=name,
|
@@ -2317,6 +2332,7 @@ class FeatureStore:
|
|
2317
2332
|
),
|
2318
2333
|
refresh_mode=row["refresh_mode"],
|
2319
2334
|
refresh_mode_reason=row["refresh_mode_reason"],
|
2335
|
+
initialize=initialize,
|
2320
2336
|
owner=row["owner"],
|
2321
2337
|
infer_schema_df=infer_schema_df,
|
2322
2338
|
session=self._session,
|
@@ -2343,6 +2359,7 @@ class FeatureStore:
|
|
2343
2359
|
warehouse=None,
|
2344
2360
|
refresh_mode=None,
|
2345
2361
|
refresh_mode_reason=None,
|
2362
|
+
initialize="ON_CREATE",
|
2346
2363
|
owner=row["owner"],
|
2347
2364
|
infer_schema_df=infer_schema_df,
|
2348
2365
|
session=self._session,
|