code: def union(
      ctx: Context,
      role: Role,
      input_data_list: cpn.dataframe_inputs(roles=[GUEST, HOST]),
      output_data: cpn.dataframe_output(roles=[GUEST, HOST]),
  ):
      from fate.ml.preprocessing import Union
  
      data_list = []
      data_len_dict = {}
      for data in input_data_list:
          data_name = f"{data.artifact.metadata.source.task_name}.{data.artifact.metadata.source.unique_key()}"
          # logger.debug(f"data_name: {data_name}")
          data = data.read()
          data_list.append(data)
          data_len_dict[data_name] = data.shape[0]
  
      sub_ctx = ctx.sub_ctx("train")
      union_obj = Union()
      output_df = union_obj.fit(sub_ctx, data_list)
      data_len_dict["total"] = output_df.shape[0]
      ctx.metrics.log_metrics(data_len_dict, "summary")
      output_data.write(output_df)
  
label_desc: Use image node_id 1 for calling a global function with example usage: union(ctx, role, input_data_list, output_data) without return types