开发者社区 > 大数据与机器学习 > 大数据开发治理DataWorks > 正文

DataWorks想在mapreduce中指定两个表的所有分区,有什么办法吗?

DataWorks想在mapreduce中指定两个表的所有分区,用 app_id=''不可以,有什么办法吗?job);InputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_dws").partSpec("app_id=''").build(), job);
OutputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_day_dws").partSpec("app_id='*'").build(), job);

展开
收起
真的很搞笑 2023-11-14 08:03:54 81 0
4 条回答
写回答
取消 提交回答
  • 在DataWorks中,如果你想在MapReduce作业中指定两个表的所有分区,你可以使用 InputUtilsOutputUtils 类的 addTable() 方法。
    但是,你需要确保你在调用这个方法时正确地指定了分区信息。根据你的代码片段,我注意到你在为输入表 "middleoffice_report_transaction_t_wideorder_dws" 指定分区时使用了 partSpec("app_id='')。这可能意味着你想要选择所有分区,但在这种情况下,你实际上选择了包含空字符串作为其 "app_id" 分区值的所有分区。
    如果你想要选择所有分区,你应该将 partSpec() 的参数更改为 partSpec("*") 或者直接省略这个参数。例如:

    InputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_dws").partSpec("*").build(), job);
    OutputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_day_dws").partSpec("*").build(), job);
    
    2023-11-14 21:30:15
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在 DataWorks 中,您可以使用 InputUtils.addTableOutputUtils.addTable 方法来指定 MapReduce 作业的输入表和输出表。这两个方法都需要一个 TableInfo 参数,其中包含表名和分区信息。
    然而,由于 Spark SQL 不支持 app_id='' 这种方式来指定所有分区,所以您不能直接在 DataWorks 中使用这种方式。取而代之,您可以使用以下两种方法之一来解决这个问题:

    1. 使用 HiveContext 创建一个临时视图,然后再使用这个视图作为 MapReduce 作业的输入表。例如,您可以先执行以下命令:
      val df = spark.sql("SELECT * FROM middleoffice_report_transaction_t_wideorder_dws WHERE app_id=''")
      df.createOrReplaceTempView("temp_view")
      

    然后,您可以将这个临时视图作为输入表传递给 MapReduce 作业:

    val inputDF = spark.sql("SELECT * FROM temp_view")
    
    1. 使用 Hive 客户端或 Beeline 工具来查询分区表,并将其结果保存为一个新的表。例如,您可以执行以下命令:
      hive -e "CREATE TABLE middleoffice_report_transaction_t_wideorder_day_dws AS SELECT * FROM middleoffice_report_transaction_t_wideorder_dws WHERE app_id=''"
      

    然后,您可以将新创建的表作为输入表传递给 MapReduce 作业:

    val inputDF = spark.sql("SELECT * FROM middleoffice_report_transaction_t_wideorder_day_dws")
    
    2023-11-14 13:01:43
    赞同 展开评论 打赏
  • 在DataWorks的MapReduce任务中,可以通过设置partSpec参数来指定表的所有分区。但是,您提供的代码示例中存在一些问题。首先,partSpec参数应该放在TableInfo.builder()方法内部,而不是直接放在tableName方法内部。其次,app_id=''app_id='*'这样的格式是不正确的,应该使用逗号分隔多个分区。

    以下是一个修正后的示例:

    InputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_dws").partSpec("app_id='',...其他分区").build(), job);
    OutputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_day_dws").partSpec("app_id='',...其他分区").build(), job);
    

    请将...其他分区替换为实际的分区信息。这样,您的MapReduce任务就可以指定两个表的所有分区了。

    2023-11-14 09:31:19
    赞同 1 展开评论 打赏
  • 使用 app_id='' 不可以指定所有的分区,您可以尝试使用通配符 "" 来代替空字符串,如 "app_id=''"。
    例如:

    InputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_dws").partSpec("app_id='*'").build(), job);
    OutputUtils.addTable(TableInfo.builder().tableName("middleoffice_report_transaction_t_wideorder_day_dws").partSpec("app_id='*'").build(), job);
    

    这将会匹配所有 app_id 的分区。不同的系统可能会有不同的语法来表示匹配所有分区,因此请根据您的实际环境进行调整。
    image.png

    2023-11-14 09:19:02
    赞同 展开评论 打赏

DataWorks基于MaxCompute/Hologres/EMR/CDP等大数据引擎,为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台。

相关产品

  • 大数据开发治理平台 DataWorks
  • 热门讨论

    热门文章

    相关电子书

    更多
    DataWorks调度任务迁移最佳实践-2020飞天大数据平台实战应用第一季 立即下载
    DataWorks商业化资源组省钱秘籍-2020飞天大数据平台实战应用第一季 立即下载
    基于DataWorks数据服务构建疫情大屏-2020飞天大数据平台实战应用第一季 立即下载