![](/img/trans.png)
[英]i am getting error AttributeError: 'Auth' object has no attribute 'get_user' in Flask App
[英]"AttributeError: 'GoogleBaseHook' object has no attribute 'get_records'" Error while trying to run Custom SqlSensor for BigQuery
我正在将一些 DAG 从“Cloud Composer-1 Airflow-1”迁移到云“Composer-2 Airflow-2”。
我创建了一个名为BigQuerySqlSensor
的自定义模块,其作用类似于 BigQuery 的SqlSensor
。
我通过创建另一个名为MySqlSensor
的自定义模块来完成此操作,因为 Airflow 删除了BaseHook
的一些支持属性,并建议改用DbApiHook
。
我基本上使用了与 SqlSensor 相同的源代码( 可以在此处找到)并将BaseHook
模块替换为DbApiHook
。
然后我使用MySqlSensor
创建自定义BigQuerySqlSensor
,如下所示:
class BigQuerySqlSensor(MySqlSensor):
def _get_hook(self):
hook = super()._get_hook()
hook.use_legacy_sql = False
return hook
我调用BigQuerySqlSensor
的任务是:
task = BigQuerySqlSensor(
task_id='my_task',
conn_id='bigquery_default',
timeout= <Some Numbers>
poke_interval= <Some Numbers>
mode='reschedule',
sql='my_sql.sql'
)
但是,我收到如下错误:
records = hook.get_records(self.sql, self.parameters)
AttributeError: 'GoogleBaseHook' object has no attribute 'get_records'
我不确定从哪里获取GoogleBaseHook
。 我猜这与 Airflow 中的连接有关。
在我之前的 Cloud Composer 实例中,我使用相同的配置和连接运行相同的代码。 在这一点上我没有想法。 任何想法,将不胜感激!
问题是您使用的是GoogleBaseHook
而不是 BigQueryHook (可能您的连接类型是google_cloud_platform
)。
似乎可以通过定义gcpbigquery
连接来解决 - 但基础SqlSensor
class 检查挂钩类型并且不允许它(它看起来像 airflow 错误 - 似乎它已经在 airflow main
分支上解决)
我通过这样定义我自己的传感器 class 解决了这个问题:
class BigQuerySqlSensor(SqlSensor):
def _get_hook(self):
return BigQueryHook(gcp_conn_id=self.conn_id, use_legacy_sql=False, location="us")
(conn_id 是google_cloud_platform
连接的标识符)。 这样您还可以添加其他挂钩参数 - 似乎至少需要“位置”。
它适用于 Airflow 2.2.3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.