气流:错误-类型为'int'的对象没有len

如何解决气流:错误-类型为'int'的对象没有len

要求:要从雪花中获取更多数据并插入到oracle表中

问题:错误-类型为'int'的对象没有len()

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/airflow/models/taskinstance.py",line 978,in _run_raw_task
    result = task_copy.execute(context=context)
  File "/usr/local/airflow/dags/plugins/bi_plugin.py",line 5437,in execute
    orcl.bulk_insert_rows(table=self.oracle_table,rows=result)
  File "/usr/local/lib/python3.6/site-packages/airflow/hooks/oracle_hook.py",line 210,in bulk_insert_rows
    values=','.join(':%s' % i for i in range(1,len(values_base) + 1)),TypeError: object of type 'int' has no len()

代码

 def __init__(self,sNowflake_conn_id,oracle_conn_id,sql,oracle_table,target_fields,*args,**kwargs):
    super().__init__(*args,**kwargs)
    self.sNowflake_conn_id = sNowflake_conn_id
    self.oracle_conn_id = oracle_conn_id
    self.sql = sql
    self.oracle_table=oracle_table
    self.target_fields=target_fields

def get_records(self,hook,sql):
    with closing(hook.get_conn()) as conn:
        with closing(conn.cursor()) as cur:
            cur.execute(sql)
            while True:
                results = cur.fetchmany(size=10000)
                if not results:
                    break
                for result in results:
                    yield result

def execute(self,context):
    snflk_hook = SNowflakeHook(sNowflake_conn_id=self.sNowflake_conn_id)
    orcl = OracleHook(oracle_conn_id=self.oracle_conn_id)
    logging.info("Inserting rows into Oracle")
    for result in self.get_records(snflk_hook,self.sql):
        orcl.bulk_insert_rows(table=self.oracle_table,rows=[result],target_fields = self.target_fields)

编辑-解决方案与Mike建议一起使用

但是它非常慢,如何才能以10000行或更快的速度获得大量插入内容。从文件加载到表插入速度更快吗? 它正在作为每一行插入

[2020-09-28 12:54:25,346] {logging_mixin.py:112} INFO - [2020-09-28 12:54:25,346] {oracle_hook.py:229} INFO - [table_name] inserted 1 rows

解决方法

我的猜测是OracleHook.bulk_insert_rows(rows=result)只是没有将正确的类型传递给rows参数。错误明确指出,len(values_base)代码中传递给oracle_hook.py的任何值都没有len()。

这表明它期望使用Collection类型。您可能想在进行呼叫时检查result是什么类型。您可能会发现您想将其强制到orcl.bulk_insert_rows(table=self.oracle_table,rows=[result]) .....

这样的集合中

我的猜测是,您希望从bulk_insert_rows()加载列表列表。目前,您只传递一个列表

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?