问题描述
我正在尝试使用sqlAlchemy和《大期望》来测试SNowflake DB中存储的数据集的数据质量。数据集称为candidates
,关注列称为first_name
。
但是,当我跑步时
sql_dataset = great_expectations.dataset.sqlAlchemyDataset(table_name="candidates",engine=engine,schema=creds["schema"])
sql_dataset.expect_column_values_to_be_in_set("first_name",['Gather','Male'])
我得到:
ProgrammingError: (sNowflake.connector.errors.ProgrammingError) 002003 (42S02): sql compilation error:
Object 'KEBOOLA_274.WORKSPACE_48777448.CANDIDATES' does not exist or not authorized.
[sql: SELECT count(*) AS element_count,sum(CASE WHEN (first_name IS NULL) THEN %(param_1)s ELSE %(param_2)s END) AS null_count,sum(CASE WHEN (first_name NOT IN (%(first_name_1)s,%(first_name_2)s) AND first_name IS NOT NULL) THEN %(param_3)s ELSE %(param_4)s END) AS unexpected_count
FROM "WORKSPACE_48777448".candidates]
[parameters: {'param_1': 1,'param_2': 0,'first_name_1': 'Gather','first_name_2': 'Male','param_3': 1,'param_4': 0}]
(Background on this error at: http://sqlalche.me/e/13/f405)
问题在于表名没有用双引号引起来,因此SNowflake正在寻找CANDIDATES
而不是candidates
。如果找到表,列名也会出现同样的问题。
我已经测试
sql_dataset = great_expectations.dataset.sqlAlchemyDataset(table_name="\"candidates\"",schema=creds["schema"])
bu SNowflake然后正在寻找一个名为KEBOOLA_274.WORKSPACE_48777448.""candidates""
的表。
我知道默认情况下sqlAlchemy认为小写对象名称不区分大小写,因此它不包含名称。请问有什么办法解决吗?
解决方法
正如Mike Walton在评论中所建议的那样,解决方案是在使用great_expectations
包之前将所有表名都大写。
我以《 Great Expectations》的开发者身份在Superduct工作。几周前,我提交了fix for this!现在,您可以在use_quoted_name
中指定batch_kwargs.
属性,如果将此属性设置为True,它将表和column_names区分大小写,因此访问小写表名应该没有问题,尽管您会还需要确保正确指定了其他表名和列名的大小写。