<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def insert( self, obj=None, overwrite=False, partition=None, values=None, validate=True, ):
 """ Insert into Impala table. Wraps ImpalaClient.insert Parameters obj : TableExpr or pandas DataFrame overwrite : boolean, default False If True, will replace existing contents of table partition : list or dict, optional For partitioned tables, indicate the partition that's being inserted into, either with an ordered list of partition keys or a dict of partition field name to value. For example for the partition (year=2007, month=7), this can be either (2007, 7) or {'year': 2007, 'month': 7}. validate : boolean, default True If True, do more rigorous validation that schema of table being inserted is compatible with the existing table Examples -------- # Completely overwrite contents """

        if isinstance(obj, pd.DataFrame):
            from ibis.impala.pandas_interop import write_temp_dataframe

            writer, expr = write_temp_dataframe(self._client, obj)
        else:
            expr = obj

        if values is not None:
            raise NotImplementedError

        if validate:
            existing_schema = self.schema()
            insert_schema = expr.schema()
            if not insert_schema.equals(existing_schema):
                _validate_compatible(insert_schema, existing_schema)

        if partition is not None:
            partition_schema = self.partition_schema()
            partition_schema_names = frozenset(partition_schema.names)
            expr = expr.projection(
                [
                    column
                    for column in expr.columns
                    if column not in partition_schema_names
                ]
            )
        else:
            partition_schema = None

        ast = build_ast(expr, ImpalaDialect.make_context())
        select = ast.queries[0]
        statement = ddl.InsertSelect(
            self._qualified_name,
            select,
            partition=partition,
            partition_schema=partition_schema,
            overwrite=overwrite,
        )
        return self._execute(statement)